詳解C++中變量的初始化規(guī)則
前言
定義沒有初始化式的變量時,系統(tǒng)有時候會幫我們初始化變量。
系統(tǒng)如何初始化取決于變量的類型以及變量定義的位置。
內(nèi)置類型變量是否自動初始化取決于變量定義的位置。
函數(shù)體外定義的變量初始成0;函數(shù)體內(nèi)定義的變量不進(jìn)行自動初始化。除了用作賦值操作的左操作數(shù),其他任何使用未初始化變量的行為都是未定義的,不要依賴未定義行為。
以int類型為例,一段簡單的測試代碼:
#include <iostream> using namespace std; int a; int main() { int b; cout << a << endl; cout << b << endl; return 0; }
在VS執(zhí)行這段代碼,輸出變量a的值0,同時VS會報錯:Run-Time Check Failure #3 — The variable 'b' is being used without being initialized
。 變量a被自動初始化為0;變量b未被自動初始化。
類類型變量在定義時,如果沒有提供初始化式,則會自動調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化(不論變量在哪里定義)。如果某類型沒有默認(rèn)構(gòu)造函數(shù),則定義該類型對象時必須提供顯示初始化式。
一段簡單的測試代碼(默認(rèn)構(gòu)造函數(shù)由編譯器自動生成):
#include <iostream> using namespace std; class testA { public: void printf() const { cout << data << endl; } private: int data; }; testA a; int main() { testA b; a.printf(); b.printf(); return 0; }
在VS執(zhí)行這段代碼,得到以下結(jié)果:
編譯器自動生成的默認(rèn)構(gòu)造函數(shù)使用與變量初始化相同的規(guī)則來初始化數(shù)據(jù)成員。對象a在函數(shù)體外定義,其int類型數(shù)據(jù)成員被初始為0;對象b在函數(shù)體內(nèi)定義,合成默認(rèn)構(gòu)造函數(shù)不會對其進(jìn)行初始化(符合內(nèi)置類型變量初始化規(guī)則),其中存放的都是隨機(jī)值。同樣,如果數(shù)據(jù)成員是類類型,則會調(diào)用相應(yīng)的默認(rèn)構(gòu)造函數(shù)對數(shù)據(jù)成員進(jìn)行初始化。
如果稍微改變一下這個類的定義,定義一個構(gòu)造函數(shù)以阻止編譯器自動生成默認(rèn)構(gòu)造函數(shù):
#include <iostream> using namespace std; class testA { public: testA(int a) { data = a; } void printf() const { cout << data << endl; } private: int data; }; testA a; int main() { testA b; a.printf(); b.printf(); return 0; }
這段代碼無法通過編譯:error C2512: “testA”:
沒有合適的默認(rèn)構(gòu)造函數(shù)可用。
總結(jié)
以上就是關(guān)于C++中變量的初始化規(guī)則的全部內(nèi)容,希望這篇文章的內(nèi)容對大家學(xué)習(xí)使用C++能有所幫助,如果有疑問可以留言交流,謝謝大家對我們的支持。
上一篇:全面了解#pragma once與 #ifndef的區(qū)別
欄 目:C語言
下一篇:概述C++中的 public protected private friend關(guān)鍵字的用法
本文標(biāo)題:詳解C++中變量的初始化規(guī)則
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2067.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個結(jié)點的最低共同父結(jié)點的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法