对象的初始化
从程序设计的角度,对象只是变量,因此:
在栈上创建对象时,成员变量初始为随机值
在堆上创建对象时,成员变量初始为随机值
在静态存储区创建对象时,成员变量初始为0值
小结
每个对象在使用之前都应该初始化
类的构造函数用于对象的初始化
构造函数与类同名并且没有返回值
构造函数在对象定义时自动被调用
带有参数的构造函数
构造函数可以根据需要定义参数
一个类中可以存在多个重载的构造函数
构造函数的重载遵循c++重载的规则
友情提醒
对象定义和对象声明不同
对象定义-申请对象的空间并调用构造函数
对象声明-告诉编译器存在这样一个对象
Test t; //定义对象并调用构造函数
int main()
{
//告诉编译器存在名为t的Test对象
extern Test t;
return 0;
}
构造函数的自动调用
int main()
{
Test t; //调用 Test()
Test t1(1); //调用Test(int v)
Test t2 = 1; //调用Test(int v)
return 0;
}
构造函数的调用
一般情况下,构造函数在对象定义时被自动调用
一些特殊情况下,需要手工调用构造函数
如何创建一个对象数组?
Test ta[3] = {Test(), Test(1), Test(2)};
特殊的构造函数
两个特殊的构造函数
无参构造函数
没有参数的构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
拷贝构造函数
参数为const class_name& 的构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制
拷贝构造函数的意义
兼容c语言的初始化方式
初始化行为能够符合预期的逻辑
浅拷贝:拷贝后对象的物理状态相同
深拷贝:拷贝后对象的逻辑状态相同
编译器提供的拷贝构造函数只进行浅拷贝!
什么时候需要进行深拷贝?
对象中有成员指代了系统中的资源
成员指向了动态内存空间
成员打开了外存中的空间
成员使用了系统中的网络端口
......
一般性原则
自定义拷贝构造韩寒苏,必然需要实现深拷贝!!!
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];
}
}