詳解C++中變量的初始化規(guī)則
前言
定義沒有初始化式的變量時(shí),系統(tǒng)有時(shí)候會(huì)幫我們初始化變量。
系統(tǒng)如何初始化取決于變量的類型以及變量定義的位置。
內(nèi)置類型變量是否自動(dòng)初始化取決于變量定義的位置。
函數(shù)體外定義的變量初始成0;函數(shù)體內(nèi)定義的變量不進(jìn)行自動(dòng)初始化。除了用作賦值操作的左操作數(shù),其他任何使用未初始化變量的行為都是未定義的,不要依賴未定義行為。
以int類型為例,一段簡(jiǎn)單的測(cè)試代碼:
#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會(huì)報(bào)錯(cuò):Run-Time Check Failure #3 — The variable 'b' is being used without being initialized。 變量a被自動(dòng)初始化為0;變量b未被自動(dòng)初始化。
類類型變量在定義時(shí),如果沒有提供初始化式,則會(huì)自動(dòng)調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化(不論變量在哪里定義)。如果某類型沒有默認(rèn)構(gòu)造函數(shù),則定義該類型對(duì)象時(shí)必須提供顯示初始化式。
一段簡(jiǎn)單的測(cè)試代碼(默認(rèn)構(gòu)造函數(shù)由編譯器自動(dòng)生成):
#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é)果:

編譯器自動(dòng)生成的默認(rèn)構(gòu)造函數(shù)使用與變量初始化相同的規(guī)則來初始化數(shù)據(jù)成員。對(duì)象a在函數(shù)體外定義,其int類型數(shù)據(jù)成員被初始為0;對(duì)象b在函數(shù)體內(nèi)定義,合成默認(rèn)構(gòu)造函數(shù)不會(huì)對(duì)其進(jìn)行初始化(符合內(nèi)置類型變量初始化規(guī)則),其中存放的都是隨機(jī)值。同樣,如果數(shù)據(jù)成員是類類型,則會(huì)調(diào)用相應(yīng)的默認(rèn)構(gòu)造函數(shù)對(duì)數(shù)據(jù)成員進(jìn)行初始化。
如果稍微改變一下這個(gè)類的定義,定義一個(gè)構(gòu)造函數(shù)以阻止編譯器自動(dòng)生成默認(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ī)則的全部?jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家學(xué)習(xí)使用C++能有所幫助,如果有疑問可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
C++語法中的函數(shù)重載和默認(rèn)參數(shù)
這篇文章主要介紹了C++語法中的函數(shù)重載和默認(rèn)參數(shù),本文從語法角度通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法
Buffer Overflow是C語言中常見且危險(xiǎn)的內(nèi)存錯(cuò)誤之一,它通常在程序試圖向緩沖區(qū)(如數(shù)組或內(nèi)存塊)寫入超過其容量的數(shù)據(jù)時(shí)發(fā)生,本文將詳細(xì)介紹Buffer Overflow的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下2024-07-07
C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合(HashSet)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++中std::priority_queue的使用小結(jié)
std::priority_queue是C++ STL提供的優(yōu)先隊(duì)列,本文主要介紹了C++中std::priority_queue的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
C語言通過gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串
在遇到包含空格的字符串輸入時(shí)該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結(jié)束了,顯然這樣是讀取不了的。本文就將介紹兩個(gè)可以對(duì)含空格字符串讀取的庫函數(shù)------gets和gets_s函數(shù),感興趣的可以了解一下2021-12-12
C++實(shí)現(xiàn)LeetCode(28.實(shí)現(xiàn)strStr()函數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(28.實(shí)現(xiàn)strStr()函數(shù)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

