我正在學習 C 中的繼承。我遇到了以下宣告:
換句話說,this 指標不能在建構式中使用別名:
extern struct D d;
struct D
{
D(int a) : a(a), b(d.a) {} // b(a) or b(this->a) would be correct
int a, b;
};
D d = D(1); // because b(d.a) did not obtain a through this, d.b is now unspecified
上面的例子來自cppreference。
我的第一個問題是“this不能在 ctor 中使用別名”,但在上面的示例中,他們在評論中寫道“b(this->a)將是正確的”。這對我來說似乎是矛盾的,因為當他們說this不能在 ctor 中使用別名時,我明白“this不能在 ctor 中使用”。但是,為什么他們說如果不能在演員中使用/別名,那么寫作b(this->a)是正確的。this初始化串列不是被認為是“在 ctor 中”嗎?
現在讓我們看一個自定義示例:
struct Name
{
private:
int x = 0;
Name(int n )
{
this->x = 4; //is the use of "this" well-defined here?
}
};
我的第二個問題是this->x上面顯示的轉換建構式中的運算式的使用是否定義明確?我的意思是,因為根據我的問題開頭的參考this不能在 ctor 中使用別名,所以這應該是無效的。
uj5u.com熱心網友回復:
這意味著在構造類物件期間,對物件的非靜態資料成員的任何訪問都應通過從this建構式直接或間接獲得的指標/glvalue 發生。否則,這種訪問讀取的值是未指定的。
所以this->a總是好的,因為a它與this->a.
也可以this通過它復制指標和訪問成員,例如
auto p = this;
b = p->a;
或存盤對物件的參考:
auto& r = *this;
b = r.a;
但是在開頭給出的例子中,指向d的是同一個物件。this換句話說,名稱d和*this是同一物件的別名。d由于不是d從this. 或者更準確地說,未指定此類訪問將讀取什么值。所以可能會也可能不會將成員b(d.a)初始化為與.ba
見[class.cdtor]/2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460431.html
上一篇:運行時未定義的符號
