C++複製建構函式

熊一帆發表於2019-05-11

為什麼要有這玩意

誰知道

定義

  • 複製建構函式,也是建構函式,所以定義的方式相似

  • 標誌是,它的第一個引數必須是類的引用,或者類的const引用

  • 不存在過載,即使寫了多個複製建構函式,最後被呼叫的只有一個

  • 預設的複製建構函式,與賦值語句一樣,都是值拷貝

#include <iostream>
#include <stdio.h>

using namespace std;

class Person {
public:
    // 三種方式,推薦前二種
    // 1. 推薦,存在唯一的const Person &
    Person(const Person & person) {
        cout << "Person1" << endl;
    };
    // 如果兩種方式同時存在,會呼叫沒有const的版本
    // 2. 推薦,存在唯一的Person &
    Person(Person & person) {
        cout << "Person2" << endl;
    };
    // 3. 不推薦,這個依然是複製建構函式,詭異。與第二種方法存在二義性
//    Person(Person & person, int i = 0) {
//        cout << "Person3" << endl;
//    };
    // 無參建構函式
    Person() {
        
    }
    ~Person() {
        cout << "~Person" << endl;
    }
};

int main() {
    Person p1; // 呼叫無參的建構函式,當你定義複製建構函式時,無參建構函式就需要自己定義了
    
    // 主動呼叫方式有兩種,推薦第一種
    Person p2(p1); // 推薦,呼叫複製建構函式
    Person p3 = p2; // 不推薦,還是呼叫複製建構函式
    
    p2 = p1; // 賦值,把p1中得值拷貝到p2中,只是值拷貝,不會呼叫複製建構函式。
    return 0;
}

呼叫複製建構函式的三種情況

主動呼叫

// 主動呼叫方式有兩種,推薦第一種
Person p2(p1); // 推薦,呼叫複製建構函式
Person p3 = p2; // 不推薦,還是呼叫複製建構函式

傳參呼叫

// 函式,需要一個Person型別的引數,不能是指標或引用
void print(Person person) {
    // ...
}
int main() {
    Person person;
    print(person); // 呼叫複製建構函式
    return 0;
}

返回值呼叫

有的地方說,下面這種方式會呼叫複製建構函式。在我的機器上沒有出現。

Person getPerson() {
    Person person;
    printf("%p
", &person);
    return person;
}
int main() {
    Person person = getPerson();
    /* 兩個地址,是一樣的,而且並未呼叫解構函式,
       說明getPerson函式返回的物件由person直接接收了,
       不是說區域性變數會被回收嘛,試試string也是一樣的*/ 
    printf("%p
", &person);
    return 0;
}

相關文章