1.构造函数:是进行初始化的函数,主要特点:名称和类名相同,没有返回值
默认构造函数:不带任何参数的构造函数
构造函数主要步骤:1、开辟空间2、给开辟的内存进行初始化(主要是为了生成对象)
构造函数可以重载
2、析构函数:是进行清理资源的函数
结构:~类名();
析构函数的主要步骤:1.清理资源2.清理空间(主要是为了对象的销毁)
先构造的后析构,析构函数不可以重载
析构函数不是自己调用,一旦调用就退化为普通函数
当对象生存周期到达之后,系统再调一次析构函数清理内存
3、拷贝构造函数:是已存在的对象生成一个类型相同的对象
系统给出的拷贝构造函数本质上是浅拷贝,只是把指向指过去
引用拷贝构造的形参?
CGoods(const CGoods rhs)-----循环拷贝,生成形参对象
CGoods(const CGoods &rhs)-----引用不生成对象
拷贝构造:形参一定要是引用,防止递归调用拷贝构造形参对象的情况
4、赋值运算符重载函数:是已存在的对象赋给已存在一个相同类型的对象
形参const
1.防止实参被修改
2.接收隐式生成的临时量
CGoods& operator=(const CGoods & rhs)
{
if(this==&rhs)
{
return *this;
}
delete [] mname;
mname=new char[strlen(rhs.mname)+1]();
memcpy(mname,rhs.mname,strlen(rhs.mname+1);
}
系统给出的函数具有的特点:1.公有的2.内联的
类中的六个默认的成员方法 设计者不提供 系统自动提供
设计者提供 系统不提供
程序代码:
#include
using namespace std;
class CGoods
{
public:
CGoods(char* name, int amount, int price)//带有三个参数的构造函数
{
cout << this << " CGoods(char* ,int, int)" << endl;
mname = new char[strlen(name) + 1]();
memcpy(mname, name, strlen(name) + 1);
mamount = amount;
mprice = price;
}
CGoods(int price)//带有一个参数的构造函数
{
cout << this << " CGoods(int)" << endl;
mname = new char[1]();
mprice = price;
}
~CGoods()//析构函数
{
cout << this << " ~CGoods()" << endl;
delete[] mname;
mname = NULL;
}
CGoods(const CGoods& rhs)//拷贝构造函数
{
cout << this << " CGoods(const CGoods&)" << " <== " << &rhs << endl;
mname = new char[strlen(rhs.mname) + 1]();
memcpy(mname, rhs.mname, strlen(rhs.mname) + 1);
mamount = rhs.mamount;
mprice = rhs.mprice;
}
//good1 = good2;
void operator=(const CGoods& rhs)//赋值运算符重载函数
{
cout << this << "void operator=(const CGoods&)" << " <== " << &rhs << endl;
if (this == &rhs)
{
return;
}
delete[] mname;
mname = new char[strlen(rhs.mname) + 1]();
memcpy(mname, rhs.mname, strlen(rhs.mname) + 1);
mamount = rhs.mamount;
mprice = rhs.mprice;
}
private:
char* mname;
int mamount;
int mprice;
};
int main()
{
CGoods good1("good1", 10, 10);
good1 = CGoods(10);//显式生成临时对象
good1 = 10;//隐式生成临时对象
return 0;
}
运行结果: