您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++的定義,聲明和初始化實(shí)例分析的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++的定義,聲明和初始化實(shí)例分析文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
變量的定義用于為變量分配存儲(chǔ)空間,還可以為變量指定初始值。
int units_sold; double sales_price, avg_price; std::string title; Sales_item curr_book; // class Sales_item
C++ 支持兩種初始化變量的形式:復(fù)制初始化和直接初始化。復(fù)制初始化語(yǔ)法用等號(hào)(=),直接初始化則是把初始化式放在括號(hào)中。
int ival(1024); // direct-initialization int ival = 1024; // copy-initialization
初始化不是賦值。初始化指創(chuàng)建變量并給它賦初始值,而賦值則是擦除對(duì)象的當(dāng)前值并用新值代替。
當(dāng)定義沒(méi)有初始化式的變量時(shí),系統(tǒng)有時(shí)候會(huì)幫我們初始化變量。
1.內(nèi)置類(lèi)型變量
(Built-in Types,即int,float,double,void,char,bool等。注意string是標(biāo)準(zhǔn)庫(kù)定義的類(lèi)型,不是內(nèi)置類(lèi)型)
在函數(shù)體外定義的變量都初始化成 0,在函數(shù)體里定義的內(nèi)置類(lèi)型變量不進(jìn)行自動(dòng)初始化。
2.類(lèi)
類(lèi)通過(guò)定義一個(gè)或多個(gè)構(gòu)造函數(shù)來(lái)控制類(lèi)對(duì)象的初始化。創(chuàng)建類(lèi)類(lèi)型的新對(duì)象,都要執(zhí)行構(gòu)造函數(shù),保證每個(gè)對(duì)象的數(shù)據(jù)成員具有合適的初始值。
構(gòu)造函數(shù)可以包含一個(gè)構(gòu)造函數(shù)初始化列表,以一個(gè)冒號(hào)開(kāi)始,接著是一個(gè)以逗號(hào)分隔的數(shù)據(jù)成員列表,每個(gè)數(shù)據(jù)成員后面跟一個(gè)放在圓括號(hào)中的初始化式。與任意的成員函數(shù)一樣,構(gòu)造函數(shù)可以定義在類(lèi)的內(nèi)部或外部。
構(gòu)造函數(shù)初始化只在構(gòu)造函數(shù)的定義中而不是聲明中指定。
//將 isbn 成員初始化為 book 形參的值,將 units_sold 和 revenue 初始化為 0。 Sales_item::Sales_item(const string &book): isbn(book), units_sold(0), revenue(0.0) { }
如果沒(méi)有提供初始化式,那么就會(huì)使用默認(rèn)構(gòu)造函數(shù)。如果類(lèi)具有默認(rèn)構(gòu)造函數(shù),那么就可以在定義該類(lèi)的變量時(shí)不用顯式地初始化變量。例如,string 類(lèi)定義了默認(rèn)構(gòu)造函數(shù)來(lái)初始化 string 變量為空字符串。
string a; cout << "a: " << a <<endl;
輸出:
a:
此外,省略初始化列表在構(gòu)造函數(shù)的函數(shù)體內(nèi)對(duì)數(shù)據(jù)成員賦值是合法的。
Sales_item::Sales_item(const string &book) { isbn = book; units_sold = 0; revenue = 0.0; }
不管成員是否在構(gòu)造函數(shù)初始化列表中顯式初始化,類(lèi)類(lèi)型的數(shù)據(jù)成員總是在初始化階段初始化。初始化發(fā)生在計(jì)算階段開(kāi)始之前。(也就是函數(shù)體執(zhí)行以前)→ 這里似乎有些難以理解,通過(guò)后文的實(shí)例也許你能明白
在構(gòu)造函數(shù)初始化列表中沒(méi)有顯式提及的每個(gè)成員,使用與初始化變量相同的規(guī)則來(lái)進(jìn)行初始化。運(yùn)行該類(lèi)型的默認(rèn)構(gòu)造函數(shù),來(lái)初始化類(lèi)類(lèi)型的數(shù)據(jù)成員。內(nèi)置或復(fù)合類(lèi)型的成員的初始值依賴于對(duì)象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中它們被初始化為 0。
未初始化的變量
局部作用域的內(nèi)置類(lèi)型變量將不被自動(dòng)初始化,這可能導(dǎo)致其成為未初始化的變量。這是常見(jiàn)的程序錯(cuò)誤,但編譯器無(wú)法檢測(cè)出所有未初始化變量的使用。→ 你肯定可以理解這可能導(dǎo)致的災(zāi)難性后果了(這竟然不可以運(yùn)行,為什么呢?這竟然可以運(yùn)行,為什么呢?.jpg)再稍微解釋一下原因:?jiǎn)栴}出在未初始化的變量事實(shí)上都有一個(gè)值。編譯器把該變量放到內(nèi)存中的某個(gè)位置,而把這個(gè)位置的無(wú)論哪種位模式都當(dāng)成是變量初始的狀態(tài)。當(dāng)被解釋成整型值時(shí),任何位模式都是合法的值——雖然這個(gè)值不可能是程序員想要的。因?yàn)檫@個(gè)值合法,所以使用它也不可能會(huì)導(dǎo)致程序崩潰??赡艿慕Y(jié)果是導(dǎo)致程序錯(cuò)誤執(zhí)行和/或錯(cuò)誤計(jì)算。
聲明用于向程序表明變量的類(lèi)型和名字。定義也是聲明:當(dāng)定義變量時(shí)我們聲明了它的類(lèi)型和名字。
可以通過(guò)使用extern關(guān)鍵字聲明變量名而不定義它。extern 聲明不是定義,也不分配存儲(chǔ)空間。事實(shí)上,它只是說(shuō)明變量定義在程序的其他地方。程序中變量可以聲明多次,但只能定義一次。
extern int i; // declares but does not define i int i; // declares and defines i
只有當(dāng)聲明也是定義時(shí),聲明才可以有初始化式,因?yàn)橹挥卸x才分配存儲(chǔ)空間。初始化式必須要有存儲(chǔ)空間來(lái)進(jìn)行初始化。如果聲明有初始化式,那么它可被當(dāng)作是定義,即使聲明標(biāo)記為 extern:
extern int i = 10; //defines i
在 C++ 語(yǔ)言中,變量必須且僅能定義一次,而且在使用變量之前必須定義或聲明變量。
#include <iostream> #include <string> using namespace std; //類(lèi)x的聲明 //如果這一部分放在main()函數(shù)后面,報(bào)錯(cuò):error: 'x' was not declared in this scope //在實(shí)際工程中,這部分聲明將放在頭文件(.h)中,而構(gòu)造函數(shù)及成員函數(shù)的定義則放在.cpp文件中 class x{ public: x(int a, int b, string c); void print_data(); private: //類(lèi)數(shù)據(jù)成員的變量名最好在開(kāi)頭加一個(gè)字母m(即member) int ma; int mb; string mc; }; int main(){ int a1(2); //直接初始化 int b1 = 3; //復(fù)制初始化 string c1; //默認(rèn)構(gòu)造函數(shù)初始化string變量為空字符串 c1 = "dwkw"; //賦值 x data(a1, b1, c1); //調(diào)用構(gòu)造函數(shù)初始化 return 0; print_data(); } //構(gòu)造函數(shù)定義 x::x(int a, int b, string c):ma(a), mb(b), mc(c){} //成員函數(shù)定義 void x::print_data(){ cout << "ma: " << ma << endl; cout << "mb: " << mb << endl; cout << "mc: " << mc << endl; }
輸出:
ma: 2
mb: 3
mc: dwkw
如果在類(lèi)的聲明中就對(duì)數(shù)據(jù)成員提供初值,而不在初始化列表中提供,程序可以執(zhí)行,輸出ma的值為1。
class x{ public: x(int a, int b, string c); void print_data(); private: int ma = 1; //聲明時(shí)提供初值 int mb; string mc; }; //去掉初始化列表 x::x(int a, int b, string c):mb(b), mc(c){}
這一做法在早期版本不予支持,但從c++11就可以了。[2]
不過(guò)這破壞了類(lèi)的抽象性,并不建議這樣做。
查看c++版本的方法:[3]
cout << __cplusplus << endl; //輸出c++版本
前面提到省略初始化列表在構(gòu)造函數(shù)的函數(shù)體內(nèi)對(duì)數(shù)據(jù)成員賦值是合法的。
//去掉初始化列表,在構(gòu)造函數(shù)體內(nèi)賦值 //其它代碼保持不變 x::x(int a, int b, string c){ cout << "賦值前: " << endl; print_data(); cout << "賦值后: " << endl; ma = 4; mb = 5; mc = "ser"; }
輸出:
賦值前:
ma: 4199744
mb: 0
mc:
賦值后:
ma: 4
mb: 5
mc: ser
實(shí)際上我就沒(méi)寫(xiě)初始化列表,但系統(tǒng)它就會(huì)在這里執(zhí)行初始化??傊蜁?huì)在執(zhí)行構(gòu)造函數(shù)體內(nèi)的語(yǔ)句之前初始化(如果它可以自動(dòng)初始化),即使根本沒(méi)寫(xiě)初始化列表。→ 嘖,我就像在說(shuō)繞口令,希望你能明白我的意思
但是ma和mb都是局部作用域(我不確定類(lèi)作用域是否是局部作用域,但從輸出來(lái)看,ma不是0,所以應(yīng)該沒(méi)有能夠初始化)的內(nèi)置類(lèi)型變量,不進(jìn)行自動(dòng)初始化;mc有默認(rèn)構(gòu)造函數(shù),自動(dòng)初始化為空字符串。
而后,執(zhí)行構(gòu)造函數(shù)體內(nèi)部的語(yǔ)句,將對(duì)ma和mb進(jìn)行初始化(我想這里應(yīng)該是初始化而不是賦值),對(duì)mc賦值。
關(guān)于“C++的定義,聲明和初始化實(shí)例分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C++的定義,聲明和初始化實(shí)例分析”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。