类和对象-中(6个默认函数详解)

本文深入解析C++中类的六大默认函数:构造函数、析构函数、拷贝构造函数、赋值操作符重载、取地址操作符重载及const修饰的取地址操作符重载。详细阐述了它们的特性和使用场景,帮助读者理解并掌握这些关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要是对类的6个默认函数进行讲解

类的默认成员函数有6个:构造函数

                                               析构函数

                                               拷贝构造函数

                                               赋值操作符重载

                                             取地址操作符重载

                                              const修饰的取地址操作符重载

构造函数:

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象是有编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期调用一次。

特性:函数名与类名相同。

             无返回值

             对象构造(对象实例化)时编译器自动化调用对应的构造函数。

            构造函数可以重载。

            当自定义构造函数时,编译器就不会生成默认的无参构造函数。

              无参的构造函数和全缺省的构造函数都称为缺省构造函数,并且它和无参函数中只能有一个。

用处:当你想初始化成员时,可以用自定义的构造函数,但是这里初始化这个词并不适合,应该叫他赋值(初始化只有一次,而赋值可以有很多次)。

如何初始化:利用初始化列表,以一个冒号开始,接着以一个逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。例如:

class Date
{
  public:
Date(int year,int month,int day)
         :_year(year)
          ,_month(month)
            ,_day(day)
             {} 
private:
         int _year;
         int _month;
         int _day;
      
};

重点:初始化只能初始化一次

            成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

          尽量避免使用成员初始化成员

          类中包含以下成员,一定要放在初始化列表位置进行初始化:

     1. 引用成员变量

     2.const成员变量

     3.类类型成员(该类有非缺省的构造函数)

 析构函数:

与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作

特性:1.析构函数名实在类名前加上一个字符~

          2.无参数无返回值

           3. 一个类有且只用一个析构函数,若未显示定义,系统会自动生成默认的析构函数

          4.对象生命周期结束时,C++编译器系统会自动调用析构函数

例如:

class Seqlist
{
    pubilc:
         Seqlist(int capacity = 10)
      {
          _pata = (int *)malloc(capacity*sizeof(int));
         _size = 0;
      }
     ~Seqlist()
   {
      if(_pData)
     {
        free(_pData);
         _pData = NULL;
           _size = 0;
      } 
  }
  private:
   int * _pData;
    int _size;
}

注意:析构函数踢被不是删除对象,而是做一些对象删除前的相关工作

拷贝构造函数:

只有单个形参,该形参是对本类类型对象的引用(一般用const修饰)在用已存在的类类型对象,创建新对象时由编译器自动完成

特性:拷贝函数是构造函数的一个重载形式

          拷贝函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷的递归调用

赋值操作运算符重载:

存在的原因:当我们要给对象加减一个数时,需要自己写个ADD函数实现的功能,但是这种方式太麻烦了,C++引入了运算符重载,它具有返回值类型,函数名字以及参数,其返回值与参数列表与普通的函数类似,函数名字:关键字operator后面接需要重载的运算符符号,

特性:不能通过连接其他符号来创建新的操作符:比如operator@

            重载操作符必须有一个类类型或者枚举类型的操作符

          用于内置类型的操作符,其含义不能改变

         作为类成员的重载函数,其形参看起来比操作数目少一成员函数的操作符有一个默认的形参this,限定第一个形参

举例:

  Date d;

d = d+10;

其中d+10会调用赋值重载运算符,将d的地址传给this,返回一个Date类,将它赋值给d。

陷阱:运算符不能重载  .*   ::     sizeof   ?:    . 

const成员/函数

在C++中,const修饰的变量已经成为一个常量,具有宏属性,在编译期间,就会替换

修饰成员函数,实际修饰隐含的this,不能对类的成员函数进行修改

取地址及const取地址操作符重载

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,如果不想让别人取到指定的内容

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值