对象的构造与析构
- 一 前言
创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的。
原因:类相当于一个模板,是一种新数据类型,而非变量,当程序声明一个类,未申
请存储空间,只有当这个类定义对象时才申请空间
为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
- 二 概念
有关构造函数
1构造函数定义
1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
2)构造函数在定义时可以有参数;
3)没有任何返回类型的声明。
2构造函数的调用
自动调用:一般情况下C++编译器会自动调用构造函数
手动调用:在一些情况下则需要手工调用构造函数
有关析构函数
3析构函数定义与调用
1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数
语法:~ClassName()
2)析构函数没有参数也没有任何返回类型的声明
3)析构函数在对象销毁时自动被调用
4)析构函数调用机制
C++编译器自动调用
- 三 为什么使用构造析构方案
普通方案:
为每个类都提供一个public的initialize函数;
对象创建后立即调用initialize函数进行初始化。
优缺点分析
1)initialize只是一个普通的函数,必须显示的调用
2)一旦由于失误的原因,对象没有初始化,那么结果将是不确定的
没有初始化的对象,其内部成员变量的值是不定的
3)不能完全解决问题
需要构造析构方案原因
1.类没有写构造函数,c++编译器提供默认的构造函数
2.定义对象数组时,没有机会进行显示初始化,需要一个一个初始化
Test21 arr[3];
//Test arr_2[3] = {Test(1,3), Test(), Test()};
system("pause");
return rv;
- 四 构造函数分类及调用
1无参数构造函数
调用方法: Test t1, t2;
2 有参构造函数
有参构造函数的三种调用方法
Test5 t1(10); //c++编译器默认调用有参构造函数 括号法
Test5 t2 = (20, 10); //c++编译器默认调用有参构造函数 等号法
Test5 t3 = Test5(30); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法
注意:对象的初始化和对象赋值不同
3 拷贝构造函数调用时机
赋值构造函数的四种调用场景(调用时机)
第1和第2个调用场景
/赋值构造函数的第一个应用场景
//用对象1 初始化 对象2
AA a2 = a1; //定义变量并初始化 //初始化法
a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy
//用对象1 初始化 对象2
AA a2(a1); //定义变量并初始化 //括号法
第3个调用场景
void f ( Location p )
{
cout<< "Funtion:" << p.GetX() << "," <<p.GetY() << endl ;
}
void mainobjplay()
{
Location A ( 1, 2 ) ; //形参是一个元素,函数调用,会执行实参变量初始化形参变量
f( A ) ;
}
第4个调用场景
返回一个匿名对象,分配一个内存,看后边如何调用(初始化还是赋值)
void f ( Location p )
{
cout<< "Funtion:" << p.GetX() << "," <<
p.GetY() << endl ;
}
Location g()
{
Location A(1, 2);
return A;
}
//对象初始化操作
和 =等号操作 是两个不同的概念
//匿名对象的去和留,关键看,返回时如何接
void mainobjplay()
{
//若返回的匿名对象,赋值给另外一个同类型的对象,那么匿名对象会被析构
//Location B;
//B = g(); //**用匿名对象 赋值 给B对象,然后匿名对象析构**
//**若返回的匿名对象,来初始化另外一个同类型的对象,那么匿名对象会直接转成新的对象**
Location B = g();
cout<<"传智扫地僧测试"<<endl;
}
上一篇: ps保存图片太大怎样调小?
下一篇: STL源码剖析——set相关算法