1. 程式人生 > >C++初始化

C++初始化

c++11 revenue log body style truct unit 報錯 創建

1、聲明和定義的關系

聲明使得名字為程序所知,一個文件如果想使用別處定義的名字必須包含對那個名字的聲明。變量聲明規定了了變量的類型和名字,定義除了這一點相同外,還為變量申請存儲空間,也可能為變量賦初始值。如果想聲明一個變量而非定義它,就在變量名前面添加關鍵字extern,而且不要顯示初始化變量:

extern int i;//聲明i而非定義i

int i;//聲明並定義i

任何包含了顯式初始化的聲明即成為定義,即使有extern關鍵字:

extern double pi=3.14;//定義

變量只能被定義一次,但可以被多次聲明。

2、初始化及其方式

當對象在創建時獲得了一個特定的值,我們說這個對象被初始化了。

(1)默認初始化

如果定義變量時沒有指定初值,則變量被默認初始化,此時變量被賦予了默認值,默認值由定義的變量類型和定義的位置決定。如果是內置類型,它的值由位置決定,定義於任何函數之外的變量被初始化為0,定義於函數體內部的變量的值是未定義的。每個各自決定其初始化對象的方式,是否允許不經初始化就定義對象也由類自己決定。

(2)列表初始化

用花括號({})來初始化變量的方式就叫列表初始化,如果我們使用列表初始化且初始值存在丟失信息的風險,編譯器會報錯:

long double ld=3.1416926536;

int a{ld},b={ld};//錯誤,轉換未執行,因為存在丟失信息的風險

int c(ld),d=ld;//正確,轉換執行,且確實丟失了部分值

(3)拷貝初始化

如果用等號(=)初始化一個變量,實際執行的是拷貝初始化,編譯器把等號右邊的值拷貝到新創建的對象中去:

string s5="hello,world";//拷貝初始化

(4)直接初始化

如果不使用等號執行的就是直接初始化:

string s5("hello,world");//直接初始化

當初始值只有一個時,使用直接初始化或拷貝初始化都行,如果要用到的值有多個,一般只能用直接初始化的方式
string s7(10,‘c‘);

(5)值初始化

比如在vector對象時,只提供對象容納元素的數量而略去初始值,此時庫會創建一個值初始化的元素初值,並把它賦給容器中的所有元素:

vector<int> ivec(10);//10個元素,每個元素初始化為0

這種初始化的方式有兩個特殊限制:

如果vector對象中元素的類型不支持默默人初始化,我們就必須提供初始的元素值。

如果只提供元素的數量而沒有設定初始值,只能使用直接初始化。

(6)類內初始值

C++11新標準規定,可以為數據成員提供一個類內初始值,創建對象時,內類初始值用於初始化類中的數據成員,沒有初始值的成員將被默認初始化。

struct S{

  std;:string bookNo;

  units_sold=0;

  double revenue=0.0;

};

初始化時bookNo初始化為空字符串,units_sold和revenue都初始化為0。

對類內的初始值的限制:或者放在花括號裏,或者放在等號右邊,記住不能使用圓括號。

積分

C++初始化