对象的构造与析构

  • 一 前言

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的

原因:类相当于一个模板,是一种新数据类型,而非变量,当程序声明一个类,未申
请存储空间,只有当这个类定义对象时才申请空间

为了解决这个问题,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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值