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;
}
相关推荐
weixin_3077791320 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
Frank_refuel1 天前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
hetao17338371 天前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
longlongzihan1 天前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
潼心1412o1 天前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
-森屿安年-1 天前
按身高排序
c++·算法
山下梅子酒2251 天前
洛谷-入门-B2079
c语言
(Charon)1 天前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
朔北之忘 Clancy1 天前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
汉克老师1 天前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程