[英]int x; int y; int *ptr; is not initialization, right?
我正在閱讀JP Mueller和J. Cogswell撰寫的“C ++ All-in-One for Dummies”並偶然發現:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
這段代碼首先初始化所有涉及的東西 - 兩個整數和一個指向整數的指針。
只是為了確認,這是一個錯誤,應該讀作'......通過聲明',對吧? 對我來說,這樣的基本錯誤仍然會出現在書中,這一點很奇怪。
從語言的角度來看,這是默認初始化 。 問題是,它們被初始化為不確定的值。
否則,什么都不做:具有自動存儲持續時間的對象(及其子對象)被初始化為不確定值。
具有自動和動態存儲持續時間的非類變量的默認初始化會生成具有不確定值的對象(靜態和線程局部對象初始化為零)
請注意,任何讀取這些不確定值的嘗試都會導致UB 。
從標准來看, [dcl.init] / 7
默認初始化T類型的對象意味着:
如果T是(可能是cv限定的)類類型([class]),則考慮構造函數。 枚舉適用的構造函數([over.match.ctor]),並通過重載決策([over.match])選擇初始化程序()的最佳構造函數。 使用空參數列表調用如此選擇的構造函數來初始化對象。
如果T是數組類型,則每個元素都是默認初始化的。
否則,不執行初始化。
這段代碼既聲明又定義了三個變量,但沒有初始化它們(它們的值被認為是不確定的 )。
變量聲明只能包含關鍵字extern
。
對。 因此,“假人”。 :)
我們甚至不能將這歸咎於遺產; 歷史上,C程序員會聲明*變量,然后在第一次賦值時“初始化”它。
但是,如果沒有初始化程序,簡單地聲明一個變量就不會被視為“初始化”它。**
所以措辭是錯的。
*從技術上講, 我們談論的是定義 ,但當我們說“聲明變量”時,我們幾乎總是指定義聲明。
**雖然具有靜態存儲持續時間的對象在其他任何事情發生之前都會經歷自己的零初始化階段,因此在這種情況下,自己進行初始化並不是一個災難。 但是,我們不能聲稱我們已經初始化了該對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.