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;
}
相关推荐
C++ 老炮儿的技术栈1 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai10071 小时前
STL深度剖析2
java·c++·算法
幻智星科技1 小时前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂1 小时前
2026蓝桥杯青少组图形化真题:校园飞机大战解析(全国青少年信息素养·电子学会图形化考级)
c++·python·算法·bfs·信息学竞赛
CodeYp20191 小时前
第16讲:set 和 map 的使用
开发语言·c++·set·map
傲世仙尊2 小时前
vector起步与底层-三个指针迭代器失效与为模板升级内置类型
c++
誰能久伴不乏4 小时前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
choumin13 小时前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
下一站春风里14 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法