請注意:您可能認為這篇文章與這篇舊文章是重復。但是上述帖子是12年前的,沒有一個答案提到 C 11 及之后的版本。
更重要的是,我的問題是關于投票最多的答案的評論,我的問題是關于下面的詳細代碼片段。
根據這個答案的評論,它說[強調我的]:
使用 C 11,您也可以在堆疊中執行此操作;乙物件{}; 將使物件值初始化(為 0),而不是 B obj;它將被默認初始化(垃圾)。
但是對于這段代碼片段,它們之間似乎沒有區別。提示:注意上述代碼片段的輸出。
new Line()
是默認初始化的,但它確實不是垃圾。
這是前面提到的代碼片段:
#include <utility>
#include <iostream>
#include <string>
template<typename T>
struct Point {
T x;
T y;
};
struct Line{
Point<double> head;
Point<double> tail;
double *demo;
int color;
//std::string comment;
};
template<typename T>
std::ostream& operator<<(std::ostream& os, const Point<T>& point)
{
os << "(" << point.x <<"," << point.y <<")";
return os;
}
std::ostream& operator<<(std::ostream& os, const Line& line)
{
os << "head: " << line.head << std::endl;
os << "head: " << line.tail << std::endl;
os << "demo=" << static_cast<void*>(line.demo) << std::endl;
os << "color=" << line.color << std::endl;
//os << "string=" << line.comment << std::endl;
return os;
}
int main()
{
auto ptr2lineWithBracket = new Line();
std::cout << *ptr2lineWithBracket;
std::cout << "==================" << std::endl;
auto ptr2lineWithout = new Line;
std::cout << *ptr2lineWithout;
}
這是輸出:
head: (0,0)
head: (0,0)
demo=0
color=0
==================
head: (0,0)
head: (0,0)
demo=0
color=0
uj5u.com熱心網友回復:
關于 new T() 和 new T 之間的一些具體區別的問題
new T()
是值初始化。對于諸如Line
和之類的聚合類,Point<T>
這意味著所有子物件都是值初始化的。對于原始物件,例如double*
和int
這意味著零初始化。
new T
是默認初始化。對于這樣的聚合類Line
,Point<T>
這意味著所有子物件都是默認初始化的。對于諸如double*
和之類的原始物件,int
這意味著沒有初始化。如果物件未初始化1,則它具有不確定的值。這意味著它們的值是不確定的。如果程式讀取不確定值(窄字符型別以外的型別),則程式的行為是undefined。這是要避免的。不要這樣做。
示例程式讀取不確定的值,其行為未定義。
在 C 11 及之后
自 C 03 將值初始化添加到語言中以來,這些方面沒有任何變化。
與示例沒有直接關系,但在 C 11 中為值初始化添加了一個新語法:(new T {}
除了使用花括號進行臨時和變數初始化的類似語法之外)。
1請注意,無論您使用何種語法,具有靜態存盤持續時間的物件都會在任何其他初始化之前初始化為零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469965.html
上一篇:我們可以取xvalue的地址嗎
下一篇:在C 中理解友元函式時出錯