C++ 拷贝函数 拷贝构造函数 析构函数 赋值运算符

构造函数

一.定义:

每个类都分别定义了它的对象被初始化的方式,类通过一个或者几个特殊的成员函数从而控制其对象初始化的过程,
这些函数我们称之为:构造函数

二.特性:

2.1

构造函数的名字和类名相同,且没有返回类型;除此以外构造函数的参数列表可以为空,函数体内也可以为空

2.2

构造函数不能被声明成const。

三.默认构造函数

#include<iostream>
using namespace std;
class Test
{
    
    
public:

private:
	int m_data;
};
void  main()
{
    
    
	Test t;//调用构造函数

在这里插入图片描述

我们并没有为对象t提供初始值,所以默认构造函数将t.m_data初始化为随机值


  • 默认构造函数是编译器创建出来的构造函数,又称为合成的默认构造函数
  • 默认构造函数无任何实参

拷贝构造函数

一.定义:

如果一个构造函数的第一个参数是自身类类型的引用,而且任何额外参数都有默认值,我们称此构造函数为:拷贝构造函数

class Test
{
    
    
public:
	Test(int a =0)
	{
    
    
		m_data = a;
	}
	Test(const Test &t)
	{
    
    
		m_data = t.m_data;
	}
private:
	int m_data;
};
void  main()
{
    
    
	Test t;//调用构造函数
	Test t1 = t;//调用拷贝构造函数
}
  • 拷贝构造函数的第一个参数必须是一个引用类型 如果第一个参数不是引用类型,那么调用拷贝构造函数永远也不会成功,因为我们要给形参调用构造函数,如此一来会造成无限循环现象。

析构函数

一.定义

析构函数将构造函数创建的资源进行释放,并且销毁对象的非static数据成员。

二.特性

1.析构函数是类的一个成员函数
2.名字由波浪号接类名构成
3.没有返回值
4.不接受参数

#include<iostream>
using namespace std;
class Test
{
    
    
public:

	~Test()//析构函数
	{
    
    

	}
private:
	int m_data;
};
void  main()
{
    
    
	Test t;//调用构造函数
}

- 由于析构函数不接受参数,因此它不能被重载。对一个给定的类,只会有唯一一个析构函数

重载赋值运算符

一.定义

重载运算符本质上也是函数,其名字由operator关键字后接要定义的运算符的符号组成
赋值运算符就是一个名为operator=的函数

二.特性

赋值运算符通常应该返回一个指向其左侧运算对象的引用

#include<iostream>
using namespace std;
class Test
{
    
    
public:

	Test& operator=(const Test &t)//传引用效率更高,不用调用构造函数为形参开辟空间
	{
    
    
		if (this != &t)//判断调用的形参是否为自己
		{
    
    
			m_data = t.m_data;
		}
		return *this;// 如果if里面条件成立直接返回,否则赋值之后返回
	}
private:
	int m_data;
};
void  main()
{
    
    
	Test t;//调用构造函数
	Test t1 = t;
}

调用四个函数的完整代码:

#include<iostream>
using namespace std;
class Test
{
    
    
public:
	Test(int a = 10)
	{
    
    
		m_data = a;
		cout << "Create Test Obj and the Address is: "<< this<<endl;
	}
	Test(const Test &t)
	{
    
    
		m_data = t.m_data;
		cout << "Create Test Obj and the Address is: " << this << endl;
	}
	Test& operator=(const Test &t)
	{
    
    
		if (this != &t)
		{
    
    
			m.data = t.m_data;
		}
		return *this;
	}
	~Test()
	{
    
    
		cout << "Free Test Obj and the Address is:" << this<<endl;
	}
private:
	int m_data;
};
void  main()
{
    
    
	Test t;//调用构造函数
	Test t1 = t;
}

猜你喜欢

转载自blog.csdn.net/ahuyccc/article/details/115034119