2026.9.15日C++类和对象学习收获笔记

前言:

我将c++学习以及知识整理以这种短小的笔记形式展现,旨在巩固我的c++知识以及为未来的就业和实习铺路,感谢各位阅读的老师和同学,你们见证着我的成长在这里。

今天练习和学习4点:

(1)运算符重载函数实现复用功能

在学习过程中,我发现了一些比较方便的编写代码的技巧:复用

cpp 复制代码
//假如已经自定义了一个日期类Date
//Date的私有成员是:_year _month _day
//现在实现运算符+/+=的重载,以完成对日期+天数的功能
//运算符重载函数是成员函数
Date& operator += (int days){
       _day += day;
       while(_day>getdaynum(_year,_month))
       {
            _day-=getdaynum(_year,_month);
            _month++;
            if(_month==13){
                _year++;
                _month=1;
            }
       }
       
       return  *this;     
};

Date Date::operator+(int day){
        Date temp=*this;
        temp += day;
        return temp;
};

我们一旦写好了+=的运算符重载函数,剩下的+我们能完全复用+=的逻辑

而且需要注意的是+=的运算符重载函数是改变类对象的,而+是不应该改变类对象的。

所以对于+=返回的是引用,而+则是返回一个类(是对函数内的改动一个临时类对象的一个拷贝)

(2)究竟是+复用+=逻辑好还是+=复用+逻辑好?

我们可以分析一些对比一下两个写法:

cpp 复制代码
//+复用+=逻辑:

Date& Date::operator+=(int day){
       
       _day += day;
       while(_day>getdaynum(_year,_month))
       {
            _day-=getdaynum(_year,_month);
            _month++;
            if(_month==13){
                _year++;
                _month=1;
            }
       }
       
       return  *this;
};
Date Date::operator+(int day){
        Date temp=*this;//第一次拷贝构造函数调用
        temp += day;
        return temp;//返回时候对temp进行第二次拷贝构造函数
};
//总计两次拷贝构造函数的开销

//+=复用+的逻辑:
Date& Date::operator+=(int days){
       *this =*this + days;//计算(*this+day返回一个类对象)后涉1 次赋值操作
       return *this;
       
};
Date Date::operator+(int day){
        Date temp = *this;//第二次拷贝构造
        temp._day += day;
       while(temp._day>getdaynum(temp._year,temp._month))
       {
            temp._day-=getdaynum(temp._year,temp._month);
           temp. _month++;
            if(temp._month==13){
                temp._year++;
                temp._month=1;
            }
       }
       
       return  temp;//返回的时候再来一次拷贝构造
};
//总计2次拷贝构造函数+1 次赋值操作的开销

显然是是+复用+=的效率更高的。

(3)对于++的运算符重载函数需要注意

日期类Date A;

A++;

++A;

这显然是不相同的计算方式,但是如果要写运算符重载,会发现他们的函数名都是:operator++

c++语法给出了明确的区分规则

cpp 复制代码
//对于后置++:A++
Date operator++(int)
//对于前置++:++A
Date operator++();

(4)利用现成的输入输出流对象来运算符重载

cin是istream类的对象,istream这个类的成员函数种有对>>的运算符重载定义,所以我们才能使用cin>>来完成相应的代码功能,同理cout是类ostream类的对象,cout<<的代码功能自然也早早写入类的成员函数里;

osteam类里的<<运算符重载作为成员函数的声明之一有:

cpp 复制代码
ostream& operator<<(int val);
......

为此,通过对 >><< 运算符进行重载,我们就可以利用 C++ 中现成的输入流 cin 和输出流 cout,让自定义类型也能够像内置类型一样,以流的形式完成数据的输入和输出。

cpp 复制代码
istream& operator>>(istream& mycin,Date& a){
      cout<<"请输入年月日:";
      mycin>>a._year>>a._month>>a._day;
      return mycin;
}
ostream& operator<<(ostream& mycont,const Date& a){
      mycont<<a._year<<"年"<<a._month<<"月"<<a._day<<"日";
      return mycont;
}
void test01(){
      Date A,B;
      cin>>A;
      cin>>B;
      cout<<A;
      cout<<B;
}
相关推荐
刚入门的大一新生1 小时前
Linux-简单设计libc库
linux·c++
irislinAmelia1 小时前
Day11文章_多路视频流加权公平调度与令牌桶QoS
c语言·人工智能
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
c++·算法·leetcode
讳疾忌医丶11 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
2401_8685347811 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
软件课代表CiCi11 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
蒸蒸yyyyzwd12 小时前
从面经中学到的三件事
c++·笔记
时时三省13 小时前
【时时三省】计算机c语言二级考试选择题重点
c++
云泽80815 小时前
STM32 USART 详解(八):C I/O 串口重定向原理与实现
c语言·stm32·嵌入式硬件