构造函数
一.定义:
每个类都分别定义了它的对象被初始化的方式,类通过一个或者几个特殊的成员函数从而控制其对象初始化的过程,
这些函数我们称之为:构造函数
二.特性:
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;
}