C++_类和对象2_类中6个默认的函数

类中6个默认的函数:

特点:自己不提供时、由系统提供、所有系统提供的函数都是共有的、内联的,系统提供的函数调用时无形参列表且自动调用
           自己提供时、系统不再提供

1、构造函数
2、析构函数
3、拷贝构造函数
4、赋值运算符的重载函数
5、取地址操作符的重载函数
6、const修饰的取地址的操作符的重载函数

对象的生成:1、开辟内存     2、内存空间的初始化

1、构造函数:构造函数和类名相同
      (1)、作用:给类的实例化对象赋资源
      (2)、初始化对象的内存空间、生成对象的一环
      (3)、构造函数可重载
      (4)、构造函数不可手动调用、由系统调用
      (5)、构造函数为顺序构造

 CGoods(char* name, float price, int amount)                                                                   //构造函数
    {
        std::cout << this << " :CGoods::CGoods(char*,float,int)" << std::endl;
        mname = new char[strlen(name) + 1]();
        strcpy(mname, name);
        mprice = price;
        mamount = amount;
    }

 CGoods()        //系统默认构造函数
    {}

2、析构函数: 析构函数和类名相同并在函数名前加‘~’
      (1)、作用:给类的实例化对象释放资源
      (2)、析构函数原型只有一个
      (3)、析构函数不可重载
      (4)、析构函数可手动调用、退化成普通函数的调用
      (5)、先构造的函数后进行析构

   ~CGoods()                                                                                                                       //析构函数
    {
        std::cout << this << " :CGoods::~CGoods()" << std::endl;
        delete[] mname;
    }

    ~CGoods()     //系统默认析构函数
    {}

3、拷贝构造函数:拷贝构造函数和类名相同
      (1)、作用:用一个已存在的对象生成一个新的相同类型的对象
      (2)、拷贝构造函数默认使用浅拷贝
      (3)、形参必须使用引用对象、防止递归构造形参对象导致栈溢出
      (4)、拷贝构造函数对于指针类型只将新指针指向与原指针相同的内存单元并不创建新的内存单元

    CGoods(const CGoods& rhs)                                                                                           //拷贝构造函数
    {
        std::cout << this << " :CGoods::CGoods(const CGoods&)" << std::endl;
        mname = new char[strlen(rhs.mname) + 1]();
        strcpy(mname, rhs.mname);
        mprice = rhs.mprice;
        mamount = rhs.mamount;
    }

4、赋值运算符的重载函数:需要进行的运算符前加 "operator" 返回值类型为函数本身类型,返回对象的引用
      (1)、作用:把一个已存在的对象赋值给相同类型的已存在对象实现
      (2)、重载函数默认使用浅拷贝,当两个指针指向同一个内存时使用深拷贝
      (3)、形参必须使用常引用,防止实参被修改、接收隐式生成的临时变量
      (4)、当拷贝构造函数的this指针所指向的地址与参数rhs指针所指向地址相同时直接进行赋值
      (5)、当拷贝构造函数的this指针所指向的地址与参数rhs指针所指向地址不相同时:1、释放旧资源 2、开辟新资源 3、赋值

    CGoods& operator=(const CGoods& rhs)                                                                       //赋值运算符的重载函数
    {
        std::cout << this << " :CGoods::operator=(const CGoods&)" << std::endl;
        if (this != &rhs)
        {
            delete[] mname;
            mname = new char[strlen(rhs.mname) + 1]();
            strcpy(mname, rhs.mname);
            mprice = rhs.mprice;
            mamount = rhs.mamount;
        }
        return *this;
    }

5、取地址操作符的重载函数:
6、const修饰的取地址的操作符的重载函数:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值