C++类中的6个默认函数

C++中的6个默认函数分别是:

1、构造函数

2、拷贝构造函数

3、析构函数

4、赋值运算符重载函数

5、取地址操作运算符的重载函数

6、带有const的取地址运算符重载函数

系统给出的函数:
1.公用的
2.内联的

对于这6个默认函数,我们分别看一下:

1、构造函数(专门用于对象的初始化)

  构造函数主要做两个工作: 1.分配对象内存空间     2.调用对象的构造函数

没有实现构造函数
系统会给出默认的构造函数
自己出构造函数 系统就不会提供默认的构造函数

class CGood()
{
public:
         CGood(){}
         CGood(char *name=NULL,int age=0):_name(name),_age(age)   {}
         CGood(char *name,int age)
         {
              this->_name=new char[strlen(name)+1];
              strcpy(_name,name);
              this->_age=age;
         }  
             
private:
        char* _name;
        int _age;    
};

2.拷贝构造函数

用一个已经存在的对象初始化相同类型新对象----------》调用的拷贝构造函数
   2.1必须传引用 (防止实参和形参递归构造)
   2.2系统提供的拷贝构造函数   浅拷贝(多次释放同一资源)

    CGoods(const CGoods& rhs)
	{
		 
		_name = new char[strlen(rhs._name) + 1];
		strcpy(_name, rhs._name);
        _age=rhs._age;
    }

3.赋值运算符重载函数
   3.1void operator=() //运算符重载
   3.2用已存在的对象给另一个已存在的对象赋值
   3.3系统提供的赋值运算符重载函数 浅拷贝

   3.4多次释放同一资源,内存泄漏
   3.5     1.防止自赋值
             2.释放旧资源
             3.开辟新资源进行初始化

void operator=(const CGood &rhs)
	{
	    if(this==&rhs)
		{
		    return;
		}
		delete[] _name;
		_name=new char[strlen(rhs._name)+1];
		_age=rhs._age;
	}

4.析构函数

1、释放对象资源

2、释放对象所占空间

    ~CGoods()
	{
		cout << this << ":~CGoods()" << endl;
		delete[] _name;
		_name = NULL;
	}

5.取地址操作运算符的重载函数

    CGood *operator&()
	{
	    return this;
	}

6.带有const的取地址操作运算符的重载函数

    const CGood* operator&()const
	{
	    return this;
	}

这里要清楚常对象、常成员函数、常数据成员.

    常对象:类型 const  对象  / const 类型 对象

     1、不允许常对象访问任何类的成员函数,一旦定义,在生存周期内不允许改变

     2、const 对象定义时由构造函数初始化

     3、const 对象只能访问常成员函数

  常数据成员:  数据类型 const 数据成员名;

     1、只能通过构造函数的初始化列表进行,不能被更新修改

 常成员函数:

 返回类型  成员函数名 (参数表)const;

1、const 是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字

2、const成员函数不能更新对象的数据成员,也不能访问该类中没有用const 修饰的成员函数

比如:   在CGood类中有个打印函数:

               void show()  {}

             int main()

             { 

                 CGood  good1("lisi",23);

                 const   CGood  good2("zhangsan",23);

                 good1.show();

                 good2.show();//error

             }

          这是为什么?    good1.show();   对象调用其成员函数的时候,编译器其实是:

              this=&good1;

              this->show();

         而this  指针的类型是  CGood *const ;      good2 的类型是const  CGood*;

         所以要使const修饰的变量不能改变,那么都加上const

         const  CGood *---------------------》  const  CGood * const,   所以一般打印函数我们都写成常方法就好了

         void show() const

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值