簡體   English   中英

定義一個類構造函數

[英]defining a class constructor

我正在處理我關於C ++編程的第一門課程,這就是告訴我定義類構造函數的方式:

class_name(int x, int y){
    this->x=x;
    this->y=y;
  };

如果我理解正確,正如我在這里多次發現的那樣,我可以這樣重寫它:

field(int x, int y) : m_x(x), m_y(y){};

但是具有以下受保護的變量:

protected:
    int m_x, m_y;

代替

protected:
    int x, y;

它們之間是否有區別,或者只是不同的寫作方式?

並且,如果是這樣,為什么需要具有不同的m_xx變量?

我希望這不是一個愚蠢的問題,但我想真正理解它。

和平。

第一種初始化x和y的類型是在構造函數主體內,第二種是您使用的成員initializer-list。

它們是相同的,但是在使用繼承時必須在其中使用成員列表初始化程序,因此您不能在派生類的構造函數定義的主體內調用基本構造函數。 例如:

class A
{
    public:
        A(int x) : _x(x){} // ok
//      A(int x) {_x = x;} ok
    protected:
        int _x;
};

class B : public A
{
    public:
    //  B(int x) {A(x);} error here
        B(int x) : A(x){} // we must use member initializer list here
};

Q1。 我應該使用構造函數初始化器列表還是在構造函數的主體中初始化?

可能的話,構造器初始化器列表是最佳選擇有兩個原因:

  1. const成員,引用成員和沒有默認構造函數的成員對象只能在構造函數初始化器列表中初始化
  2. 在構造函數的主體中初始化的成員對象必須是默認構造的,然后分別初始化。 錯過了優化機會並阻止了這些對象在1中被召喚出任何成員

Q2。 我應該對成員變量使用命名約定嗎?

是。 例如 ,Google建議使用下划線來命名成員變量,但是m_前綴可以達到相同的目的,即節省讀者查找該變量是否在當前作用域中聲明或該變量是否是成員變量的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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