詳解C++中變量的初始化規(guī)則
前言
定義沒有初始化式的變量時(shí),系統(tǒng)有時(shí)候會幫我們初始化變量。
系統(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,同時(shí)VS會報(bào)錯(cuò):Run-Time Check Failure #3 — The variable 'b' is being used without being initialized
。 變量a被自動初始化為0;變量b未被自動初始化。
類類型變量在定義時(shí),如果沒有提供初始化式,則會自動調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化(不論變量在哪里定義)。如果某類型沒有默認(rèn)構(gòu)造函數(shù),則定義該類型對象時(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è)類的定義,定義一個(gè)構(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++能有所幫助,如果有疑問可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C++中strstr函數(shù)的實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了C++中strstr函數(shù)的實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C++ GDI實(shí)現(xiàn)圖片格式轉(zhuǎn)換
GDI+(Graphics Device Interface Plus)是一種用于圖形繪制和圖像處理的應(yīng)用程序編程接口(API),在Windows平臺上廣泛使用,本文就來介紹一下如何使用GDI實(shí)現(xiàn)圖片格式轉(zhuǎn)換吧2023-12-12C++設(shè)計(jì)模式之策略模式(Strategy)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之策略模式Strategy ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別介紹
這篇文章主要介紹了C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別,X86和ARM是占據(jù)CPU市場的兩大處理器,各有優(yōu)劣,本文給大家詳細(xì)介紹了兩者的區(qū)別,需要的朋友可以參考下2022-07-07C++11運(yùn)算符重載和向量類重載實(shí)例詳解(<<,>>,+,-,*等)
這篇文章主要給大家介紹了關(guān)于C++11運(yùn)算符重載和向量類重載的相關(guān)資料,主要包括<<,>>,+,-,*等,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07