为什么要有这玩意

谁知道

定义

  • 复制构造函数,也是构造函数,所以定义的方式相似

  • 标志是,它的第一个参数必须是类的引用,或者类的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("%pn", &person);
    return person;
}
int main() {
    Person person = getPerson();
    /* 两个地址,是一样的,而且并未调用析构函数,
       说明getPerson函数返回的对象由person直接接收了,
       不是说局部变量会被回收嘛,试试string也是一样的*/ 
    printf("%pn", &person);
    return 0;
}

本文固定链接: http://www.js-code.com/cpp/cpp_60087.html