拷贝构造函数
- 拷贝构造函数的定义:
同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或拷贝是完全可行的(以为他们具有同样的结构)。这个拷贝的过程只需要拷贝数据成员,而函数成员是公用的(只有一份拷贝)。因此,在建立对象时咳以用同类的另一个对象来初始化对象。这时所用的构造函数成为拷贝构造
- 拷贝构造函数的特点:
类名与函数名相同
参数是自身类型的引用(如果用值进行传递,会在传递参数时因为是对象给对象传递,也会再次调用拷贝构造,从而形成死循环,不停的调用拷贝构造函数)
- 系统默认的拷贝构造函数
也称为缺省的按成员语义支持的拷贝构造函数,对象的每个成员被依次拷贝,也称之为缺省的按成员初始化。按成员做拷贝是通过依次拷贝每个数据成员实现的,而不是对整个类按位拷贝。
#include<iostream>
using namespace std;
class Test
{
public:
Test(int data=0)
{
this->data=data;
}
Test(const Test &t) //拷贝构造,加const是为了保护对象t不被修改
{
data=t.data; //成员给成员赋值
}
private:
int data;
};
void main()
{
Test t(8);
Test t1(t); //等价于Test t1=t;用已有对象初始化新对象调用拷贝构造函数
}
调用构造函数的时机:
1.用已有对象来初始化新对象(必须在新对象定义的同时完成初始化)
2.当函数的形参是类对象时,在调用该函数时使用。这时要在内存中新建一个局部对象,并把实参拷贝到新的对象中。
3.当函数的返回值是类对象时,函数执行完成返回着时使用。其仍然会建立一个临时对象
由于局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,因此在处理这种情况时,编译器会在调用函数的表达式中创建一个无名的临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓return对象,实际上是调用拷贝构造函数吧该对象的值拷入临时对象。如果返回值为变量,处理过程类似,只是不调用拷贝构造函数
赋值语句
- 赋值语句的定义:
对象给对象赋值(此时的两个对象均为已有对象,即已经被声明过)
- 赋值语句的特点:
重载=号
返回值为类名的&,(避免出现连=现象:t=t1=t2
,若返回值为void,则无法进行连=赋值)
形参为类名的&
#include<iostream>
using namespace std;
class Test
{
public:
Test(int data=0)
{
this->data=data;
}
Test(const Test &t)
{
data=t.data;
}
Test& operator=(const Test &t)//赋值语句
{
if(this!=&t) //判断是否是自己给自己赋值,必须判断
data=t.data;
return *this; //*this代表当前对象,this代表当前对象的地址
}
private:
int data;
};
void main()
{
Test t(8);
Test t1;
t=t1; //t与t1均为已有对象,用已有对象给已有对象赋值,调用赋值语句
}
实验代码调结果:最终将t1的data的0值赋给了t的data值