簡體   English   中英

C ++基本類構造函數

[英]C++ Basic Class Constructor

我現在正在上一門C ++課程,他們在過度解釋所有內容方面做得很好,直到涉及到在頭文件“承諾”和實現之間拆分文件。 我完全是用Python學習編程的,所以我習慣於直接聲明一切並根據需要導入類,因此,將承諾分開然后實現邏輯的整個過程對我來說很奇怪。

無論如何,我遇到了麻煩,因為在課程中他們說您實際上並不需要使用this->但是當我試圖在同一.cpp文件中顯式定義一個類時,我只能讓構造函數在以下情況下起作用我使用this-> 有人可以解釋或鏈接討論此問題的討論嗎? 我找不到在同一文件中定義所有內容的上下文中解釋此問題的參考。

class Person {
    public:
    string name;
    int age;
    int height;
    int weight;
    Person (string name, int age, int height, int weight) {
        name = name;
        age = age;
        height = height;
        weight = weight;
    }   
};

int main () {
    Person new_person("Doug", 20, 70, 170);
}

這導致我從主函數傳入的所有值都未初始化。 但是,如果我在構造函數的每一行中添加this->,則效果很好。 我發現的示例沒有使用this->所以我很困惑為什么在這里有必要。 也許這與名稱空間有關,這仍然讓我有些困惑(整個使用名稱空間std; thing),但是我認為由於它們都在同一個.cpp文件中,因此應該可以使用。

參數變量使構造函數范圍內的成員變量黯然失色 也就是說,在這種情況下, name僅指輸入變量。

您可以做的是使用初始化列表:

Person (string name, int age, int height, int weight) :
    name(name), age(age), height(height), weight(weight) {}

或使用其他名稱:

Person (string _name, int _age, int _height, int _weight) {
    name = _name;
    age = _age;
    height = _height;
    weight = _weight;
}   

但是您使用this->方法完全可以。

您可能還需要閱讀http://www.cs.technion.ac.il/users/yechiel/c++-faq/using-this-in-ctors.html

在這種情況下,你需要this ,因為你使用的是相同的名稱為您的構造函數的參數和類成員。

Person (string name, int age, int height, int weight) {
    this->name = // this-> means the member variable
        name;    // just the parameter

如果您的參數具有不同的名稱this是不必要的

Person (string name_, int age, int height, int weight) {
    name =      // the member variable
        name_;  // the parameter

->this方法的唯一問題是它是A)冗長b)沒有初始化對象。 c)使該對象不平凡。

使用初始化列表,正確的初始化構造函數應如下所示:

Person (string nm, int ag, int ht, int wt): 
    name(nm), age(ag), height(ht), weight(wt) {}

這與您所做的工作並不完全相同,在這種情況下,可以靜態創建對象而無需執行任何操作。 您的類實現始終執行分配。 C ++ 11和更高版本允許完全瑣碎的實現:

class Person {
    public:
    string name;
    int age;
    int height;
    int weight;

    void do_stuff() {};
};

// let's assume that string is std::string, 
// creation from  const char* and = are defined
int main()
{
  Person p = { "Nemo", 35, 5, 120 };
  Person p2 = p;
  p = { "John-117", 24, 6, 170 };
}

您所擁有的只是一個依賴名稱含混不清的情況。 看這里

如果當前實例化成員的查找在實例化點與定義點之間給出了不同的結果,則該查找不明確。 但是請注意,使用成員名稱時,不會自動將其轉換為類成員訪問表達式,只有顯式成員訪問表達式指示當前實例的成員:

埃利·本德斯基(Eli Bendersky)雄辯地對此作了論述。 摘錄:

您要做的就是讓編譯器了解調用f取決於模板參數T。幾種方法是用Base :: f()this-> f()替換f()。 (因為這隱含地依賴於T)。

因此,您自己的this->解決方案還不錯this->

暫無
暫無

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

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