C++ 构造函数和析构函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hejingfang123/article/details/82710753

百度百科:构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

自考书上的解释:建立一个对象时,对象的状态(数据成员的取值)是不确定的。为了使对象的状态确定,必须对其进行正确的初始化。C++有称为构造函数的特殊成员函数,它可自动进行对象的初始化。

初始化和赋值使不同的操作,当C++语言预先定义的初始化和赋值操作不能满足程序的要求时,程序员可以定义自己的初始化和赋值操作。

1 构造函数

1.1默认构造函数

为什么程序没有定义构造函数,但却可以使用类直接产生对象?

一个程序如果没有为一个类定义任何构造函数的情况下,C++编译器会自动建立一个不带参数的构造函数:Point::Point(){}

一旦程序定义了自己的构造函数,系统就不再提供默认的构造函数。

1.2构造函数

为什么构造函数的名称与类名一样,并且在定义构造函数时不能指定返回值?

如果只能由用户在程序中直接调用构造函数的话,就容易破坏安全性;如果设计成不让用户自己调用构造函数,而由编译器来调用,就可避免这一问题,这就要求编译器必须总能知道自己调用哪个函数,最简单也最符合逻辑的方法时指定构造函数名称与类名一样,并且在定义构造函数时不能指定返回类型,即使是void类型也不可以,因为如果有返回值,编译器就必须知道如何处理返回值,这样就会大大增加编译器的工作,也降低了效率。

扫描二维码关注公众号,回复: 3367608 查看本文章

一个类可以定义几个构造函数?

一个类可以有多个构造函数

1.3构造函数的定义

类可以有多个构造函数,在类体里的声明形式:

类名(形参1,形参2,…形参n);//可以没有形参

类的构造函数可以在类体内(内联函数)声明时定义,也可以在类体外定义。

类体内定义:

可以使用初始化列表或者在构造函数的函数体内定义。假设数据成员为x1,x2,…,xn,则有如下两种形式:

类名:: 类名(形参1,形参2,…形参n):x1(形参1),x2(形参2),…,xn(形参n){}

类名::类名(形参1,形参2,…形参n)

{

         x1=形参1;

         x2=形参2;

         ……

         xn=形参n;

}

类体外定义:

声明必须在类体内,定义可以在类体外,但是必须用类域名。

1.4构造函数重载

在一个类中可以定义多个构造函数,以便提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同,成员函数知道该对哪个对象进行操作,这就是函数的重载。

2 析构函数

2.1默认析构函数

如果在定义类时没有定义析构函数, C++编译器也要为它产生一个函数体为空的默认构造函数:Point::~Point(){}

2.2析构函数

在对象消失时,应使用析构函数释放由构造函数分配的内存。

析构函数的名称也与类名一样,并且在定义构造函数时不能指定返回值?

调用析构函数也是由编译器来完成的,所以编译器必须总能知道应调用哪个函数。最容易、也最符合逻辑的方法是指定这个函数的名称与类名一样。为了与构造函数区分,在析构函数的前面加上一个"~"号(仍然称析构函数与类同名)。

定义构造函数也不能指定参数,但是可以显示地说明参数为void,如A::~A(void)。

一个类可以定义几个析构函数?

从函数重载的角度分析,一个类只能定义一个析构函数且不能指明参数,以便编译器自动调用。

析构函数在对象的生存期结束时,程序会为这个对象调用析构函数,然后回收这个对象占用的内存。类的对象数组的每个元素调用一次析构函数,全局对象、全局对象数组和静态对象的析构函数在程序运行结束之前调用。

猜你喜欢

转载自blog.csdn.net/hejingfang123/article/details/82710753