目录
拷贝构造函数和赋值构造函数能否进行值传递
C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用;但是拷贝赋值函数的形参通常也是自身类型的引用,实际上拷贝赋值函数能进行值传递。
拷贝构造函数(不能进行值传递)
拷贝构造函数具有如下两种形式:
// 拷贝构造函数原型
Person(Person&); // method 1
Person(const Person&); // method 2
// 下面这种原型是错的
Person(Person); // 不能进行值传递,只能传递引用
不能进行值传递的原因:
如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环,栈满,无法完成拷贝。
赋值构造函数(可进行值传递)
拷贝赋值函数的原型:
// 拷贝赋值函数原型
Person & operator=(const Person&);
为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)。为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:
class A {
public:
A() :a(0) {}
//A(A other) { this->a = other.a; }//1.拷贝构造函数,报错
A(A& other) { this->a = other.a; }
A(const A& other) { this->a=a; }
A(int k) { a = k; }
A & operator=(A other) { // 进行值传递而非引用传递
this->a = other.a;
return other;
}
int get() { return a; }
~A() {}
private:
int a;
};
void test()
{
A mya1(1);
A mya2(mya1);
A mya3;
mya3=mya2 = mya1;
cout <<mya3.get()<<","<< mya2.get() << endl;
}