C++之使用类
- 运算符重载
- 友元函数
- 重载 << 运算符、 以便用于输出
- 状态成员
- 使用rand()生成随机值
- 类的自动转换和强制类型转换
- 类转换函数
运算符函数
operatorop(argument-list)
如 operator函数重载[]运算符。
| #ifndef MYTIME0_H_ |
| #define MYTIME0_H_ |
| |
| class Time |
| { |
| private: |
| int hours; |
| int minutes; |
| public: |
| Time(); |
| Time(int h, int m=0); |
| |
| void addMin(int m); |
| void addHr(int h); |
| void reset(int h = 0, int m =0 ); |
| Time Sum(const Time & t) const; |
| void show() const; |
| ~Time(); |
| }; |
| #endif |
| #include "mytime0.h" |
| #include <iostream> |
| |
| Time::Time(){ |
| hours = minutes = 0; |
| } |
| |
| Time::Time(int h, int m ){ |
| this->hours = h; |
| this->minutes = m; |
| } |
| |
| void Time::addHr(int h){ |
| hours += h; |
| } |
| |
| void Time::addMin(int m){ |
| minutes += m; |
| hours += minutes / 60; |
| minutes %= 60; |
| } |
| |
| void Time::reset(int h , int m){ |
| hours = h; |
| minutes = m; |
| } |
| |
| Time Time::Sum(const Time & t) const{ |
| Time sum ; |
| sum.minutes = minutes + t.minutes; |
| sum.hours = hours+t.hours+sum.minutes / 60; |
| |
| sum.minutes %= 60; |
| return sum; |
| } |
| |
| void Time::show() const{ |
| std::cout << hours << " hours, " << minutes << " minutes"; |
| } |
| |
| #include <iostream> |
| #include "mytime0.h" |
| |
| |
| int main(int argc, char const *argv[]) |
| { |
| using std::cout; |
| using std::endl; |
| |
| |
| Time planning; |
| Time coding(2,40); |
| Time fixing(5,55); |
| Time total; |
| |
| cout << "planing time = " ; |
| planning.show(); |
| cout << endl; |
| |
| cout << "coding time = " ; |
| coding.show(); |
| cout << endl; |
| |
| cout << "fixing time = " ; |
| fixing.show(); |
| cout << endl; |
| |
| total = coding.Sum(fixing); |
| cout << "Coding.sum(fixing) = "; |
| total.show(); |
| cout << endl; |
| return 0; |
| } |
将上面代码的sum函数改为operator+ 运算符重载的形式
| #ifndef MYTIME0_H_ |
| #define MYTIME0_H_ |
| |
| class Time |
| { |
| private: |
| int hours; |
| int minutes; |
| public: |
| Time(); |
| Time(int h, int m=0); |
| ~Time(); |
| |
| void addMin(int m); |
| void addHr(int h); |
| void reset(int h = 0, int m =0 ); |
| |
| Time operator+ (const Time &t) const; |
| void show() const; |
| |
| }; |
| #endif |
| #include "mytime0.h" |
| #include <iostream> |
| |
| Time::Time(){ |
| hours = minutes = 0; |
| } |
| |
| Time::Time(int h, int m ){ |
| this->hours = h; |
| this->minutes = m; |
| } |
| |
| void Time::addHr(int h){ |
| hours += h; |
| } |
| |
| void Time::addMin(int m){ |
| minutes += m; |
| hours += minutes / 60; |
| minutes %= 60; |
| } |
| |
| void Time::reset(int h , int m){ |
| hours = h; |
| minutes = m; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Time Time::operator+(const Time & t) const{ |
| Time sum ; |
| sum.minutes = minutes + t.minutes; |
| sum.hours = hours+t.hours+sum.minutes / 60; |
| |
| sum.minutes %= 60; |
| return sum; |
| } |
| |
| void Time::show() const{ |
| std::cout << hours << " hours, " << minutes << " minutes"; |
| } |
| |
| |
| Time::~Time(){ |
| |
| } |
| #include <iostream> |
| #include "mytime0.h" |
| |
| |
| int main(int argc, char const *argv[]) |
| { |
| using std::cout; |
| using std::endl; |
| |
| |
| Time planning; |
| Time coding(2,40); |
| Time fixing(5,55); |
| Time total; |
| |
| cout << "planing time = " ; |
| planning.show(); |
| cout << endl; |
| |
| cout << "coding time = " ; |
| coding.show(); |
| cout << endl; |
| |
| cout << "fixing time = " ; |
| fixing.show(); |
| cout << endl; |
| |
| total = coding + fixing; |
| cout << "Coding.sum(fixing) = "; |
| total.show(); |
| cout << endl; |
| return 0; |
| } |
运算符重载的限制
1.重载的运算符必须至少有一个操作数是用户定义的类型。
2.使用运算符时不能违反运算符原来的句法。
3.不能创建新的运算符
4.不能重载下面的运算符
- sizeof
- .
- .*
- ::
- ?:
- typeid
- const_cast
- dynamic_cast
- reinterpret_cast
- static_cast
5.下面的运算符只能通过成员函数重载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?