1.构造函数:初始化对象所占内存空间(成员变量)
函数名与类名相等,不需要返回值
字符串赋值:需要开辟内存空间
mname = new char [strlen(name) + 1]();//对象在栈上开辟(由系统开辟和释放),而对象中的内容在堆上开辟。堆内存由用户 开辟和释放
strcpy(mname,name);
1.this指针:指向对象所占的内存(不允许修改)
2.构造析构顺序:先构造的后析构(符合栈的特性先进后出)
3.构造函数和析构函数能不能重载
1.构造函数:可以重载
2.析构函数:不可重载
4.构造函数和析构函数能不能自己调用
构造函数:不可以自己调用
类的成员方法
依赖对象调用
构造函数完成后
5.默认的构造函数 默认的析构函数
CGood()
{
}
~CGood()
{
}
1.用户提供后 系统将不会提供
2.默认构造调用方式
CGood good4; //对象生成 不加括号 调用默认构造函数
CGood good4();//函数声明
2.析构函数:释放对象所占资源
释放堆内存
可以自己实现调用 但不建议调用(系统会自己调用)
调用后会退化成一个普通的成员方法
并且系统还会再调用一个析构函数
即同一段内存被释放两次(可能出现异常)
3.拷贝构造函数:
1.用一个已存在的对象构造一个相同类型的新对象
2.形参必须使用引用对象//防止死递归
3.默认拷贝构造函数
是一个浅拷贝,如果有指针类型存在,考虑是否实现深拷贝
浅拷贝:
CGoods(const CGoods& rhs)
{
mname = rhs.name // 多个指针指向同一段内存
mprice = rhs.mprice;
mamout = rhs.mamout;
}
深拷贝:
CGoods(const CGoods& rhs)
{
mname = new char[strlen(rhs.name)+1]();
strcpy(mname,rhs.mname);
mprice = rhs.mprice;
mamout = rhs.mamout;
}
4.赋值运算符的重载函数:
1.作用:用一个已存在的对象给另一个相同类型已存在的对象赋值
2.形参使用常引用const的作用:1.防止修改实参的值
2.接收隐式生成的临时对象
3.设计流程:1.自赋值判断
2.释放旧资源
3.开辟新资源
4.赋值
自赋值判断
if(this == &rhs)
{
return *this;
}
CGoods & operator=(const CGoods &rhs)
{
cout<<this<<" :CGoods::operator= (CGoods)"<<endl;
if(this != &rhs)
{
delete[] mname;
mname = new char[strlen(rhs.mname)+1]();
strcpy(mname,rhs.mname);
mprice = rhs.mprice;
mamout = rhs.mamout;
}
return *this;
}