两个特殊的构造函数:
无参构造函数:没有参数的构造函数。
拷贝构造函数:参数为 const class_name& (当前类对象) 的构造函数。
无参构造函数,当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。函数体为空,则类中最少有一个无参构造函数。
注意:只有在没有任何构造函数时,才提供默认构造函数。
拷贝构造函数,当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制。
拷贝构造函数的意义:兼容c语言的初始化方式,初始化行为能够符合预期的逻辑。
浅拷贝:拷贝后对象的物理状态相同。(指针本身,指针相同的话可能会释放两次)
深拷贝:拷贝后对象的逻辑状态相同。(指针所指向的值赋值,指针本身是不一样的)
编译器提供的拷贝构造函数只进行浅拷贝。
Test(const Test& t)
{ i=t.i;
j=t.j;
p=new int; // p, *p 是t2的成员
*p=*t.p; }
Test t2=t1; // t1 替换上边的 t
什么时候需要深拷贝?
对象中的成员指代了系统中的资源:成员指代了动态内存空间,成员打开了外存中的文件,成员使用了系统中的网络端口。
一般性原则:自定义拷贝构造函数,必然需要实现深拷贝。
IntArray::IntArray(const IntArray& obj)
{
m_length=obj.m_length;
m_pointer=new int[obj.m_length];
for(int i=0;i<obj.m_length;i++)
{
m_pointer[i]=obj.m_pointer[i];
}
}