C++四種初始化方式


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)當類類型的成員沒有在構造函數初始值列表中顯式地初始化時;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM