宣告與定義
變數的宣告(如:extern int a;宣告外部變數)告訴編譯器變數名字與型別;
變數的定義:為變數分配儲存空間,此時也可以給定初始值;
函式的宣告:告訴編譯器有這麼乙個函式;
函式的定義:實現函式,簡言之就是帶有;
與結構體一樣,類只是一種複雜資料型別的宣告,不占用記憶體空間。
而物件是類這種資料型別的乙個變數,或者說是通過類這種資料型別定義了乙個變數(物件),是占用記憶體空間的。
calss point;
point t1; // 將呼叫建構函式
point *t1;// 不呼叫建構函式
宣告乙個指標 int *p;表示*p的型別為int,p是指向int型別的指標;(即p為int* ; *p為int)
定義 int *p 時,p位於棧區,占有記憶體空間是系統分配,系統將給定乙個隨機位址(不確定位址)給p;
void main_5()
二、臨時變數的產生
臨時變數只在呼叫期間有效,有三種方式產生:
函式返回時、型別轉換時、形式引數為const時;
1、函式返回時,以值或是指標形式返回時;
int sum(int a,int b)
2、在進行 強制型別轉換時;
double a = 10.5;
cout << (int)a ;// 在強轉時,一定生成臨時變數,原始資料本身並沒有改變。
cout << a;
3、函式形參為const來保護原始資料;
三、初始化
c++的初始化方式:預設初始化、值初始化、直接初始化、拷貝初始化、列表初始化;
預設初始化
1、未初始化的 全域性內建型別(int、double)變數;
2、類 型別,都會執行預設建構函式;如string、vector;
值初始化
值初始化是值使用了初始化器(即使用了圓括號或花括號)但卻沒有提供初始值的情況;
vectorv1(10);//10個元素,每個元素的初始化為0
vectorv2(10);//10個元素,每個元素都為空
vectorv4(10, 1);//v3有10個元素,每個的值都是1
vectorv3;//v2有1個元素,該元素的值是10
vectorv5;//v4有2個元素,值分別是10和1
int *p = new int();
直接初始化
直接初始化是指採用小括號()而不使用等號=的方式進行變數初始化;
string str1(10,'9');//直接初始化
string str2(str1);//直接初始化
拷貝初始化
使用等號(賦值號=)進行初始化,編譯器把等號右側的初始值拷貝到新建立的物件中去,拷貝初始化通常使用拷貝建構函式來完成。拷貝初始化看起來像是給變數賦值,實際上是執行了初始化操作,與先定義再賦值本質不同。
int a = 0;
int a = ;
string str1 = "hello";
string s=string("123456");
初始化列表
為c++11採用的初始化方式,使用{}進行初始化操作,下列三種情況需要用到初始化成員列表: 1、
類的資料成員中含有不帶預設建構函式的
物件(包括在繼承時顯示呼叫父類的建構函式對父類成員初始化);
2、類的資料成員中含有
const修飾型別
的或引用型別
;(因為這兩種物件要在宣告後馬上初始化);
3、子類初始化父類的私有成員;
vectorv4; // 等價於 v4 =
int b[5]; // a = ;
class people// 列表初始化
private:
string name;
int age;
};
注意:初始化列表中變數的執行順序是由成員變數的宣告順序來決定的,上述並不先執行age(a),而是先執行name(n);
【舉例1】
class a ;
class b : public a ;
類物件的顯式初始化
data data1(2019,9,22);//顯式初始化,直接呼叫建構函式
data* b = new data(2019,9,22);//顯式初始化,直接呼叫建構函式,使用delete時析構
data p = data(2019,9,22);//顯式初始化,直接呼叫建構函式,沒有臨時物件,作用域結束時析構
data b(data1);//顯式初始化,呼叫拷貝建構函式,作用域結束時析構
類物件的隱式初始化
data b = a;//用乙個物件隱式初始化另一物件,呼叫拷貝建構函式,作用域結束時析構
c++11initialize_list類模板(初始化類模板)#include
#include
#include
class mynumber
}void print()
}private:
std::vectormvec;
};
int main()
; // calls initializer_list
m.print(); // 1 2 3 4
mynumber m2; // calls initializer_list
m2.print(); // 10 20 30 40
return 0;
}
變數初始化
int a 是變數定義,也就是說編譯器將為a分配儲存,這在編譯時被處理。int a 0 是定義 初始化,定義的分配儲存的action在編譯時完成,初始化的action則在執行時完成 將執行類似dword ptr ebp 4 0的指令,而單獨的int a 不會有對應的執行指令 定義是分配空間,而初始化...
static成員變數定義初始化
static成員變數不僅可以通過靜態成員函式來改變其值,還可以通過建構函式改變其值。其中靜態的建構函式僅僅能夠改變靜態的成員變數,一般建構函式可以改變靜態成員變數或者其他成員變數。以下是建構函式可以改變靜態成員變數的值的 class atest static a int atest a 0 這裡不能...
變數定義 宣告 初始化
變數定義就是告訴編譯器在何處建立變數的儲存,以及如何建立變數的儲存。變數定義指定乙個資料型別,幷包含了該型別的乙個或多個變數的列表,如下所示 type variable list 在這裡,type 必須是乙個有效的 c 資料型別,可以是 char w char int float double bo...