簡體   English   中英

每次調用默認構造函數時都會調用復制構造函數嗎?

[英]Copy constructor called everytime a default constructor is called?

碰到這個問題時,我正在研究有關構造函數初始化列表的一些問題。

考慮一下:

class Student {
    public:
        Student() {
            id = 0;
        }
        Student(int i) {
            id = i;
        }
    private:
        int id;
};

現在,檢查一下:

當您進入構造函數的主體時,所有字段都已被構造; 如果它們具有默認構造函數,則這些構造函數已被調用。 現在,如果您在構造函數的主體中為其分配值,則您正在調用復制構造函數。 這是低效的,因為最終調用了兩個構造函數而不是一個。

來源: C ++構造函數名稱后面的冒號有什么作用?

那么,這是否意味着當我調用無參數構造函數時,也會同時調用復制構造函數?

請解釋。 這真是令人困惑。

特別是第一行的含義:

當您進入構造函數的主體時,所有字段都已經被構造

這意味着int id在到達id = 0之前已經被初始化。 由於未指定任何顯式初始化程序,因此已默認初始化。 另外,因為它是一個int ,所以初始化規則告訴使用它將具有一些不確定的值。

在實踐中,對於int或任何初始化起來非常便宜的類型,這沒什么大不了的。

如果我們使用類而不是使用int成員,則可以更清楚地了解幕后的實際情況:

#include <iostream>

class Verbose {
    public:
        Verbose() {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose(int) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose(Verbose const &) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }

        Verbose & operator=(Verbose const &) {
            std::cout << __PRETTY_FUNCTION__ << "\n";
            return *this;
        }

        ~Verbose() {
            std::cout << __PRETTY_FUNCTION__ << "\n";
        }
};

class Object {
    public:
        Verbose v;

        Object() {
            v = Verbose(3);
        }
};

int main() {
    Object o;
}

此代碼將輸出:

Verbose::Verbose()
Verbose::Verbose(int)
Verbose &Verbose::operator=(const Verbose &)
Verbose::~Verbose()
Verbose::~Verbose()

請注意,我們:

  1. 我們使用默認構造函數創建v
  2. 我們創建一個臨時Verbose(3)
  3. 然后,我們使用賦值運算符將臨時變量賦給成員變量。
  4. 然后,我們銷毀臨時站點。
  5. Object o超出范圍時,我們然后銷毀成員變量。

請注意,我們基本上構造了兩次Verbose v 我們首先使用默認的構造函數,然后基本上使用operator=調用對其進行重建。 如果使用初始化列表 ,則可以將其減少為對Verbose(int)一次調用。

他們的意思是

Student() {
    id = 0;
}

效率不如

Student() : id(0) {}

在此特定示例中,由於成員只是一個int ,因此將在單個步驟中初始化id

相反,如果Student具有更多復雜的成員(例如BackpackBooks ,則后一種方法將有所作為。 如果這些類不是POD,則第一個方法將花費兩步來初始化成員,而第二個方法將只花費一個步來初始化。

暫無
暫無

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

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