1. 直接初始化直接調用與實參匹配的構造函數,形式如“T t(u)”。
2. 拷貝初始化:復制初始化首先使用指定構造函數創建一個臨時對象,然后用復制構造函數將那個臨時對象復制到正在創建的對象”,形式如“T t=u”。
直接初始化不一定要調用復制構造函數
復制初始化(拷貝初始化)一定要調用復制構造函數
注意:一般而言,在變量初始化時,盡量采用直接初始化形式,而不是拷貝初始化。
1.默認初始化
如果定義變量時沒有指定初值,則變量被默認初始化,此時變量被賦予了“默認值”。
1 int i; 2 A a;
2.直接初始化
如果不使用等號,則執行的是直接初始化。
1 int a(0); 2 string str1(“hello”); 3 string str2(10, ‘c’);//這種情況拷貝初始化不能完成 4 A a(pa);
3.拷貝初始化
如果使用一個等號初始化一個變量,實際上執行的是拷貝初始化。編譯器會把等號右側的初始值拷貝到新創建的對象中去。
1 int a = 0; 2 int a = {0}; 3 string str1 = “hello”; 4 A pa; A a = pa;
4.值初始化
顯式使用T()或T{},T為類型,括號里為空,稱為值初始化
或者容器如vector,vector<int> p(10);其中int類型有默認構造函數,此時庫會創建一個值初始化(value-initialized)的元素初值,並賦給容器中所有元素。
目前我個人的理解是:其中int是值初始化了(初始化為0),用這個0賦給p的所有10個元素。vector應該不能算值初始化,而是直接初始化。
1 vector <int>v1(10);//v1有10個元素,每個的值都是0, 2 vector <int>v2{10};//v2有1個元素,該元素的值是10 3 vector <int>v3(10, 1);//v3有10個元素,每個的值都是1 4 vector <int>v4{10, 1);//v4有2個元素,值分別是10和1
1 string *ps1 = new string; //默認初始化為空string 2 string *ps2 = new string(); //值初始化為空string 3 int *pi1 = new int; //默認初始化;*pi1的值未定義 4 int *pi2 = new int(); //值初始化為0;*pi2為0
C++ PRIMER:
值初始化:
(1)在數組初始化的過程中,如果提供的初始值數量少於數組的大小,剩下的元素會進行值初始化;
(2)當我們不使用初始值定義一個局部靜態變量時;
(3)當我們通過書寫形如T()的表達式顯示地請求值初始化時;
默認初始化:
(1)當我們在塊作用域內不使用任何初始值定義一個非靜態變量時,
(2)當一個類本身含有類類型成員且使用合成的默認構造函數時;
(3)當類類型的成員沒有在構造函數初始值列表中顯式地初始化時;