c++运算符重载
2021/4/16 20:57:15
本文主要是介绍c++运算符重载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
运算符重载函数
class class_name { public: int x; // x轴坐标 int y; // y轴坐标 class_name(); class_name(int x0, int y0); // 定义类的时候,提供一个运算符重载的对应解析函数即可 class_name operator+(const class_name& other); };
class_name class_name::operator+(const class_name & other) { // 在该函数内,去实现+的真正应该做的操作 class_name tmp; tmp.x = this->x + other.x; tmp.y = this->y + other.y; return tmp; }
class_name class_name ::operator=(const class_name & other) { // 在该函数内,去实现=的真正应该做的操作 // c = a; c是this,a是other,c=a整个表达式的值是返回值 // class_name tmp; this->x = other.x; this->y = other.y; return *this; }
coordinate coordinate::operator+=(const coordinate& other) { this->x = this->x + other.x; this->y = this->y + other.y; return *this; }
class::class_name(int x0, int y0) { x = x0; y = y0; };
class_name a(1, 3); class_name b(2, 6); class_name c; c = a + b; // 编译时被编译器翻译成: c = a.operator+(b); c = b.operator+(a);
c++ 运算符=重载函数 与 拷贝构造函数
初始化时 | 拷贝构造函数 |
---|---|
非初始化时 | 赋值运算符重载 |
赋值运算符重载若有返回值,则会调用拷贝构造函数 因为若返回值是整个对象,c++语言为了保证语义是对的,为了真正的返回一个对象, 这里面出现中间的临时变量,把return *this;复制到中间临时变量,把中间临时变量作为返回值传递出去 目的:把整个对象的值要复制一遍过去传递出去作为返回值 多了一次复制过程,才会调用拷贝构造函数
赋值运算符重载函数参数中的const
C++的const要求非常严格,在c = a + b;中如果=运算符的重载函数参数列表中没有用const会编译报错。
因为c对应的实参是a+b的值,a+b执行相当于operator+的返回值是临时变量被认为是const 所以为了匹配 运算符=重载函数要加const
避免赋值运算符中的自赋值
if (this != &other) { // } return *this;
赋值运算符重载函数返回 引用
class_name& class_name::operator=(const class_name& other) { return *this; } class_name& 和变量类型是一个级别的 this是指针,*this是变量级别的,可以返回引用
int &b = a; 类似于 int * const b = &a; 引用的本质是const指针
作用:返回引用可以避免一次返回值的值传递的对象复制,这需要消耗资源的。
运算符重载函数返回值类型对应表
普通变量 | 直接复制 |
---|---|
对象 | 拷贝构造函数 |
对象引用 | 直接复制 |
标准库中String类的运算符重载
https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5
这篇关于c++运算符重载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享