簡體   English   中英

使用此指針在初始化部分初始化數據成員

[英]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] ) 中:

  • (非靜態)成員 Scope function:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM