C++语言学习记录-13:构造函数和析构函数

构造函数

想象你刚买了一套房子,在装修之前,必然是什么都没有的毛坯房,运气不好的话里面还会有一些奇怪的东西。这个时候,就需要将房子装修,之后方可入住。
程序也是一样的,在对内存初始化之前,你的函数里面的参数可能包含了很多垃圾数据,要对垃圾数据进行清理,才能让后面的函数运行顺利,这一个过程就叫做构造函数。
和类名相同的无返回函数就是它的初始化函数(构造函数),编译器保证在创建一个对象之后、允许你使用它之前,它必定会在这个对象对应的内存上执行构造函数,按你的要求把对象装修好。如果你不写,那么它默认给你个毛坯房(这就是所谓的“默认构造函数”)。

构造函数与其他函数有三个不同点。
1.构造函数的名字必须与类名相同
2.构造函数没有返回类型
3.在创建对象时,构造函数被调用用以初始化对象

一个类的构造函数其函数名只能与类名相同,如果使用void 函数名()的方法进行定义,就会导致此函数被编译器当做一个普通的函数,也有部分编译器会发生报错。

构造函数的作用

构造函数可以用来确保每一个对象的所有数据成员都有一个明显的初始值。

构造函数的定义方式

构造函数的定义被称作构造函数初始化,其方式如下:

classname(int x, int y){
}

构造函数的分类和调用

按照参数分类

按照参数分类可以分成无参构造(默认)和有参构造

复制构造函数(拷贝至构造函数)和普通构造函数

复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性。其形参是本类的对象的引用,作用是使用一个已经存在的对象去初始化同类的一个新对象。

Example(Example e1)

构造函数在什么地方使用

一般来说,构造函数会被系统自动调用,且往往是在初始化一个变量或者对象时被自动执行。这个对象可以是一个函数或是一个类。
程序在调用对象的时候会自动调用构造,并且只会调用一次。它更像是为了使后面的函数能够顺利执行的一个开路者,从内存当中给后面的函数找到空间。

析构函数

与构造函数一样,析构函数一般也是由系统自动调用的。
析构函数的作用于构造函数相反,当一个函数被调用时,系统会先自动生成一个构造函数以分配相应的内存空间。当该对象不再被需要的时候,我们需要释放该内存空间以便其他程序使用。这一过程需要析构函数的参与,一般来说系统会自动调用。

析构函数的定义方式

析构函数的构造方式基本与构造 函数相同,只是在类名前加了~,比如

~classname(int x, int y){
}

析构函数的注意事项

1.只有一个真正的对象离开相应的作用域时,析构函数才会被调用。也就是说,像指针这一类指向地址的对象离开作用域时是不会调用析构函数的。
2.使用new运算符创建的对象的资源,只有使用delete运算符删除指向它的指针时,才会调用它的析构函数,释放它的资源。
3.析构函数不能释放类成员的内存,因为类成员属于类
4.函数名与类名相同,函数名前加上~

构造函数可以有参数,因此能够发生重载,而析构函数没有参数,因此不能重载。
下面进行一次初始化操作的示范。

class Example
{
    
    
public: 
	Example()
	{
    
    
		cout<<"这是一个类内的构造函数调用,如果是程序自动实现的话这一段为空代码";
	}
	~Example()
	{
    
    
		cout<<"这是一个析构函数调用,一般情况下也是由编译器自己执行";
};
void create()
{
    
    
	Example e1; //这个是一个栈上的数据,在函数执行完之后就会释放
}			   //因此构造函数和析构函数都会被调用
int main()
{
    
    
	create(); //这一段代码的运行结果就为上面构造函数调用中的语句
}	

总的说来,结构函数和析构函数并不需要特别刻意地去使用,只需了解概念即可。

下面举例几个构造函数的调用,运用的类型就是上面的Example类

void test01()
{
    
    
	//括号法的调用
	Example e1; //此为默认构造函数的调用以创建对象
	Example e2(10); //此为有参构造函数的调用
	Example e3(e2); //此为复制构造函数的调用
//调用默认构造函数的时候不能使用小括号,否则会被当成一个新的函数声明,而不会认为是在创建对象
	//显示法的调用
	Example e1;
	Example e2 = Example(10);
	Example e3 = Example(e2);
//上面的右值没有标识符,被称作匿名对象,在程序结束后就会被程序回收
//不要使用复制构造函数初始化匿名对象,Example(e2)会被等价为Example e2;
    //隐式转换法
    Example e2 = 10;//这时编译器自动转换为Example e2 = Example(10)
    Example e3 = e2;//相当于一个拷贝过程

构造函数可以看做是构造一个新对象的过程当中需要调用的函数,而析构函数则是将对象释放的一个函数

猜你喜欢

转载自blog.csdn.net/leanneTN/article/details/108446457
今日推荐