[英]Initialization of data member in initialization section using this pointer
#include <iostream>
#include <string>
using namespace std;
class Child {
size_t age;
string nation;
public:
Child() : age(0), nation("N/A") { }
Child(size_t a, string nation) : age((a <= 5) ? a : 0), (this->nation)(nation) { }
void showDet() {cout << age << endl << nation;}
};
在第二個構造函數中,我使用此指針來初始化字符串類型成員 var nation 但出現錯誤“成員名稱或 class 丟失”
長話短說:C++ 標准不允許在此上下文中使用this
關鍵字。
this
具有明確定義的范圍集,它可以出現在 ( [expr.prim.this] ) 中:
class S {
int i;
void foo() {
this->i = 4;
}
};
class S {
int i = sizeof(*this);
};
對於任何其他上下文,使用this
被標准視為格式錯誤。 可以爭辯說,成員初始化器列表屬於成員函數的 scope 類別,但是此列表中的標識符具有特殊的名稱查找規則( [class.base.init]/2 ):
在 mem-initializer-id 中查找非限定名稱會忽略構造函數的 function 參數 scope。
除非mem-initializer-id將構造函數的 class 命名為構造函數的 class 的非靜態數據成員,或者 class 的直接或虛擬基類,否則mem-initializer格式錯誤。
同時這意味着,您可以使用同名的構造函數參數安全地初始化成員變量:
class S {
int i;
S(int i): i(i) {}
};
最后但同樣重要的是,您要使用的語義在構造函數的主體中仍然有效,因為它是成員 function scope 發揮作用的地方:
class S {
int i;
S(int i) {
this->i = i;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.