讨论/《C++ 面试突击》 - 为什么拷贝构造函数必须为引用?/
《C++ 面试突击》 - 为什么拷贝构造函数必须为引用?

playground下的运行结果:

#include <iostream>
using namespace std;

class A
{
private:
    int val;

public:
    A(int tmp) : val(tmp) // 带参数构造函数
    {
        cout << "A(int tmp)" << endl;
    }

    A(const A &tmp) // 拷贝构造函数
    {
        cout << "A(const A &tmp)" << endl;
        val = tmp.val;
    }

    A &operator=(const A &tmp) // 赋值函数(赋值运算符重载)
    {
        cout << "A &operator=(const A &tmp)" << endl;
        val = tmp.val;
        return *this;
    }

    void fun(A tmp)
    {
    }
};

int main()
{
    A ex1(1); //A(int tmp)
    A ex2(2); //A(int tmp)
    cout<<endl;
    //1.新建对象并赋值为已有对象 拷贝初始化 因实现方式而不同!
    A ex3 = ex1; //A(const A &tmp) 拷贝构造函数
    cout<<endl;
    //2.给已有对象赋值
    ex2 = ex1; //A &operator=(const A &tmp) 赋值函数
    cout<<endl;
    //3.调用包含非引用非指针的A类型形参的函数
    ex2.fun(ex1); //A(const A &tmp) 拷贝构造函数
    cout<<endl;
    //4.新建对象并赋值为"类型名(int)"  因实现方式而不同!
    A ex4=A(4); // A(int tmp) 构造函数
    cout<<endl;
    //5.新建对象并用已有对象初始化 直接初始化 
    A ex5(ex1); //A(const A &tmp) 拷贝构造函数
    cout<<endl;
    //6.new一个对象,传参为该类的已有对象
    A *ex6=new A(ex1); //A(const A &tmp) 拷贝构造函数
    cout<<endl;
    //7.new一个对象,传参为int
    A *ex7=new A(7); //A(int tmp) 构造函数
    return 0;
}
/*
运行结果:
A(int tmp)
A(int tmp)

A(const A &tmp)

A &operator=(const A &tmp)

A(const A &tmp)

A(int tmp)

A(const A &tmp)

A(const A &tmp)

A(int tmp)
*/

展开全部 4 讨论