类的默认函数

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;

}

运行结果:


 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值