当前位置: 首页 > news >正文

C++类与对象(中)②

目录

1.赋值运算符重载

1.1运算符重载

1.2赋值运算符重载

1.2.1赋值运算符重载格式

1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 

1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。

1.3前置++和后置++重载

2.const成员函数

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


 

                                                                时光不语,我们都在努力

这里是来自M--Y的专栏:C++启航

以下内容均为个人见解,如有不足还请指出

期待大家的点赞、收藏、评论(互三必回)诸君共勉

类中的6个默认成员函数

1.赋值运算符重载

1.1运算符重载

         运算符重载提高代码可读性。函数命名为关键字operator后面接需要重载的运算符符号

特别注意:

        1.不能通过连接其他符号来创建新的操作符,如operator@

        2.重载操作符必须有一个类类型参数

        3.用于内置类型的运算符,其含义不能改变

        4.作为类成员函数重载时,其形参看起来比操作数数目少1,这是因为成员函数的第一个参数是隐式的this

        5..*        ::        sizeof        ?;        .这五个运算符不支持重载

class Date

{

public:

       // ……

private:

        int  _year;

        int  _month;

        int  _day;

bool  operator==(const  Date& d1,const  Date& d2)

{

        //……

}

如果和上述代码一样定义成全局函数的话,就无法访问到Date类中的私有成员变量,如果要使代码编译通过的话,就必须将上述代码标红处给注释掉。

这样处理的话,显得过于麻烦,所以不如将函数封装成成员函数

封装成成员函数的时候我们需要注意一点,上面注意4提到,成员函数的第一个参数是隐式的this所以在代码上要做些许调整。

class Date

{

public:

        bool operator==(const Date& d)

        {

                return _year==d._year

                &&_month=d._month

                &&_day==d._month;

        }

private:

        int _year;

        int _month;

        int _day;

} ;

1.2赋值运算符重载

1.2.1赋值运算符重载格式

        1.参数类型:const T&(传递引用可以提高传参效率)

        2.返回值类型:T&。返回引用可以提高效率,同时在有些情况下可以支持连续赋值

        3.检测是否自己给自己赋值

        4.返回*this。目的:连续赋值,下文会细讲

1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 

原因:如果用户将赋值运算符实现成全局的话,编译器就会自己生成一个默认的成员函数,这样两者就会产生冲突了

class Date

{

public:

        //……

        Date& operator=(const Date&d)

        {

                _year=d._year;

                _month=d._month;

                _day=d._day; 

                

                return *this;

        }

};

1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。

1.3前置++和后置++重载

思考:由上面叙述可以联想到关于++的运算符重载的函数名应该是operator++,但是这样的话如何区分前置++和后置++呢?

为了区分,C++特别规定:后置++重载时多加一个int类型的参数,但是调用时不用传参,编译器会自动传递。

//前置++

Date& operator++() 

{

        _day++;

        _month++;

        _year++;

        if(_day>GetMonthday())//实现输出某年某月的天数

        {

                _day-=GetMonthday();

                _month++

        }

        if(_month>=13)

        {

                _month-=12;

                _year++;

        }

        return *this;

}

后置++

//注意后置++是先是有后+1,因此需要一个临时变量来保存原来的值,所以函数的返回值应该是Date而不是Date&

Date operator++(int)

{

        Date temp=*this;

        //重复上述前置++步骤

        return temp;

 其实关于运算符的重载有很多+=,-=,+,-,>,<,>=,<=。但是如果每个运算符都按上述方式代码就会显得十分冗长。有没有什么办法呢?        答案是肯定的。

Date& Date:: operator+=(int day)//日期+天数=日期
{
    _day += day;

    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }

    while (_day < 0)
    {
        _month--;
        if (_month == 0)
        {
            _year--;
            _month = 12;
        }
        _day += GetMonthDay(_year, _month);
    }

    return *this;
}

以上上+=为例,当我们实现一个运算符重载后,和它相关的运算符重载就会变得很简单实现,只需要进行复用就行 。

Date& operator-=(int day)//日期-天数=日期

{

        return *this+=-day

}

 Date& operator++()

{

      return *this+=1;

}

Date operator++(int)

{

        Date temp=*this;

        *this+=1;

        return temp;

 其他的运算符重载也和这类似,感兴趣的可以自己去尝试实现。

2.const成员函数

用cosnt修饰的成员函数被称为const函数,实际上const修饰的是成员函数中的this,但是一般const修饰变量会加在其前面,而this是隐式的,如何表示修饰的是this呢?

C++规定将cosnt+在函数后面,就表示对this的修饰。

Date operator+(int day) const

{

        //……

}

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

这两个函数一般不用重新定义,不是特殊情况,编译器会自动生成的够用。

Date* operator&()

{

        return this;

}

const Date* operator&() const

{

        return this;

}

 

http://www.lryc.cn/news/341148.html

相关文章:

  • Qt——xml文件生成DBus接口
  • 初识SpringMVC(SpringMVC学习笔记一)
  • FreeRTOS任务管理
  • Qwen1.5大语言模型微调实践
  • 购物车实现
  • HTML5漫画风格个人介绍源码
  • 工业数学模型——高炉煤气发生量预测(三)
  • pnpm - Failed to resolve loader: cache-loader. You may need to install it.
  • CSS transition和animation的用法和区别
  • 书籍推荐(附上每本书的看点)
  • LLM理解v1
  • ubuntu 22.04 -- cmake安装
  • 字符串算法题(第二十四天)
  • 【Linux】应用层协议序列化和反序列化
  • 使用Canal同步MySQL 8到ES中小白配置教程
  • 关于部署ELK和EFLK的相关知识
  • 实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示
  • PCB---Design Entry cis 绘图 导出
  • vue 一键更换主题颜色
  • WebKit内核游览器
  • Qt 拖放功能详解:理论与实践并举的深度指南
  • Springboot+Vue项目-基于Java+MySQL的企业客户管理系统(附源码+演示视频+LW)
  • 【Linux学习】Linux指令(四)
  • 阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期
  • 统一SQL-number/decimal/dec/numeric转换
  • 软件测试入门学习笔记
  • 31. 下一个排列
  • Android笔记: mkdirs不生效失败
  • 需要添加的硬币的最小数量(Lc2952)——贪心+构造
  • 军工保密资质介绍及申请要求