C++构造函数与析构函数

C++构造函数与析构函数

1.构造函数

1.1什么是构造函数?

构造函数是一种特殊的成员函数,与其他成员函数不同,建立对象时自动执行,名字与类名相同,不具有任何类型,无返回值。

1.2什么时候调用构造函数?

在类对象进入其作用域时,调用构造函数。

1.3构造函数没有返回值,因此也不需要在定义构造函数时声明类型。比如在Time类的内部的时候,构造函数应该可以声明为Time()

1.4构造函数不能被用户调用,只是在建立对象的时候系统自动执行一次,构造函数一般声明为public。

1.5构造函数里面可以做一些别的事情,但是一般建议为了保持代码清晰,不要做与初始化无关的事情。

1.6如果用户没有定义构造函数,则系统会默认生成一个什么都不做的构造函数,所以构造函数是一定存在的。

1.7构造函数有几种类型?

A.不带参数的构造函数Time()。

B.带参数的构造函数,如Time(int h,int m,int s)

C.参数初始化表。如Time(int h,int m,int s):hour(h),minute(m),second(s){}

D.系统默认的构造函数。

1.8构造函数可以重载,类似于函数的重载。

1.9默认构造函数是什么?

调用构造函数时不必给出实参的构造函数,称为默认构造函数。所以无参的构造函数属于默认构造函数。

2.0一个类只能有一个默认构造函数。

2.1默认构造函数属于带有默认参数的构造函数。

2.2使用带有默认参数的构造函数的好处?

即使在调用构造函数时没有提供实参值,不仅不会出错,而且还按照默认的参数值对对象进行初始化。

2.3应该在什么地方使用带有默认参数的构造函数?

在构造函数的声明处,不能在定义处。

2.4声明默认构造函数的时候,形参名可以省略,如Box(int =10,int =10,int =10)

2.5全部参数都有默认值的构造函数是默认构造函数,因为一个函数里面只能有一个默认构造函数,所以不能定义多个这样的函数。

比如:

Box();    //声明了一个无参的构造函数

Box(int =10,int =10,int =10);    //声明了一个全部参数都指定了默认值的构造函数。

在建立对象时 Box box1;

编译系统就无法识别调用的是哪一个构造函数,会导致编译出错。

2.6一般不应同时使用构造函数的重载和默认参数的构造函数,因为默认参数的构造函数相当于多个重载的构造函数。


2.析构

1.1析构函数是一种特殊的成员函数,它的名称是类名的前面加一个“~”的符号,在C++里面这表示和构造函数相反的函数。
1.2当对象的生命周期结束时,就会自动调用析构函数。
A.如果在一个函数里面定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象会被释放,在释放前会调用析构函数。
B.Static局部对象在main函数结束会调用exit函数结束程序的时候会调用析构函数。
C.全局函数与Static局部对象类似。
D.用new运算符动态的建立一个对象,则当用delete释放该对象时,会调用析构函数。
1.3析构函数的作用不是删除对象,而是在对象销毁前做一些清理或者其他的工作。
1.4析构函数没有返回值,没有函数类型,没有函数参数,不能重载(一个类只能有一个析构函数),而构造函数可以有函数参数,可以重载。
1.5一般的一个类中往往有析构函数和构造函数。

3.调用构造函数和析构函数的顺序

1.1先构造的后析构,后构造的先析构。(有点像栈)
1.2什么时候调用构造函数和析构函数?
A.在全局范围中定义的对象,它的构造函数在文件中的所有函数(包括main)执行之前调用。当main函数执行完毕或使用exit函数退出程序的时候调用析构函数。
B.如果定义的是局部自动变量,则在建立对象时调用构造函数,对象释放前调用析构函数。
C.在函数内定义的局部static变量与全局变量类似。

4.特殊的构造函数(复制构造函数,转化构造函数

1.1复制构造函数的形式。
//The copy constructor definition
Box::Box(const Box& b)
{
height=b.height;
width=b.width;
length=b.length;
}
1.2复制构造函数的作用是将实参函数对象的各数据成员的值一一复制给新的对象中对应的数据成员。
1.3调用复制构造函数
方式1: Box box2(box1);   //把box1克隆出一个新对象box2
方式2: Box box2=box1,box3=box2; //用box1复制出box2,box3
1.4用户自己可以定义复制构造函数,如果没有系统会自动生成一个。
1.5复制构造函数与普通的构造函数的区别。
形式上:
A.类名(形参表列);
B.类名(类名 &对象名)
什么情况下调用:
普通构造函数在建立对象时调用,复制构造函数在用已有对象复制一个新的对象时被调用。
以下3种情况需要复制对象:
A.程序中需要新建一个对象,并用另个同类的对象对他进行初始化。
B.当函数的参数为类的对象的时候。在调用函数的时候,需要把实参对象完整的传递给形参,也就是需要建立一个实参的拷贝。
C.函数的返回值是类的对象。

转换构造函数待续。。。。。。




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值