一、拷贝对象

1. 对象发生拷贝的情形

以下情形会发生对象的拷贝(根据原有的对象,创建一个新的对象):

2. 返回值优化 Return Value Optimization, RVO

示例:

struct Person {
    string name;
    Person(const char* s) : name(s) {
        cout << "Person(const char*)" << endl;
    }
    Person(const Person& other) {
        cout << "Person(&)" << endl;
    }
};

Person foo(Person p){
    cout << "in foo()" << endl;
    return p;
}

Person bar(const char *s) {
    cout << "in bar()" << endl;
    return Person(s);
}

int main() {
    Person p1 = foo("Trump");
    cout << "-----------------------" << endl;
    Person p2 = bar("Biden");
}

考虑上述代码,其输出为:

Person(const char*)
in foo()
Person(&)
-----------------------
in bar()
Person(const char*)

解释:

3. 区分构造与赋值

示例:

int main() {
    Person p1("Trump");    // 构造
    Person p2("Biden");
    Person p3 = p1;        // 构造(由拷贝构造函数)
    p3 = p2;               // 赋值
}

二、拷贝构造函数 Copy Constructor

1. 定义