c++ 重载运算与类型转换
1. 基础概念
重载的运算符是具有特殊名字的函数:(重载运算符函数,运算符函数。重载运算符)
依次包含返回类型,函数名(operator=),参数列表,函数体。
只有重载的函数调用运算符operator()才能有默认实参。
关于参数的数量,一般来说,一元运算符有一个参数,二元有两个,三元有三个;
但是如果该运算符函数是成员函数,则其中一个运算对象将是本类对象,第一个参数隐式绑定到this常量指针上,不显示在参数列表中。成员运算符函数的参数数量比运算符对象少一个。
HasPtr& operator=(const HasPtr& right){
mString = right.mString;
return *this;
}
运算符函数要么是一个类类型的成员函数,要么它必有类类型的参数。这是因为不能重载内置类型之间的运算(可以重载类类型与类类型之间的运算,类类型和内置类型之间的运算)。
不能自己发明运算符,不能改变运算符的优先级,也不能改变运算符原始运算对象的个数,例如&运算符可以用于一元运算,也可以用于二元运算,则根据参数数量判断是一元还是二元,但是!操作符永远不可能重载为二元运算符。
2. 一个例子
可以先看一个简单的例子,重载了类类型Data的 "+" 二元运算符,该运算符函数不是成员函数,因此,参数为两个类类型,返回的是类类型中string成员的拼接版(中间加入--)
#include <iostream>
#include <string> using namespace std; class Data{
public:
Data(){}
Data(string str){
this->str = str;
}
string str;
}; string operator+(const Data& data1, const Data& data2){
string str = data1.str + " -- " + data2.str;
return str;
} int main(){
Data data1("hello"), data2("slam"), data3("!!!");
cout << data1+data2+data3 << endl;
}
输出:
hello -- slam -- !!!
若希望将操作符函数定义为Data类的成员函数,则需要改动如下:
#include <iostream>
#include <string> using namespace std; class Data{
public:
Data(){}
Data(string str){
this->str = str;
}
string str;
Data operator+(const Data& data);
}; // 只有将返回值定义为Data类型,表达式才能使用连续运算的形式data1+data2+data3
Data Data::operator+(const Data& data){
str = str + " -- " + data.str;
return *this;
} int main(){
Data data1("hello"), data2("slam"), data3("!!!");
cout << (data1+data2+data3).str << endl;
}
输出结果相同。
注意在第一个例子中(非成员函数)
data1+data2 等价于 operator+(data1, data2)
第二个例子中(成员函数调用)
data1+data2 等价于 data1.operator+(data2)
3. 常用重载运算符
1) 输入输出运算符 << >>
2) 算数和关系运算符 == != <
3) 赋值运算符 =
4) 下标运算符 []
5) 递增和递减运算符 ++ --
6) 成员访问运算符 * ->
7) 函数调用运算符 ()
c++ 重载运算与类型转换的更多相关文章
- C/C++基础----重载运算与类型转换
非成员版本 data1 + data2: operator+(data1, data2); 成员版本 data1 += data2: data1.operator+=(data2); 不建议的重载 逻 ...
- C++ Primer 5th 第14章 重载运算与类型转换
当运算符作用域类类型的对象时,可以通过运算符重载来重新定义该运算符的含义.重载运算符的意义在于我们和用户能够更简洁的书写和更方便的使用代码. 基本概念 重载的运算符是具有特殊名字的函数:函数名由关键词 ...
- 【c++ Prime 学习笔记】第14章 重载运算与类型转换
14.1 基本概念 重载的运算符是特殊的函数:名字由关键字operator后接要定义的算符共同组成,也有返回类型.参数列表.函数体. 重载运算符函数的参数量与该算符作用的运算对象数量一样多 除重载调用 ...
- C++ Primer : 第十四章 : 重载运算与类型转换之重载运算符
重载前须知 重载运算符是特殊的函数,它们的名字由operator和其后要重载的运算符号共同组成. 因为重载运算符时函数, 因此它包含返回值.参数列表和函数体. 对于重载运算符是成员函数时, 它的第一个 ...
- 高放的c++学习笔记之重载运算与类型转换
▲基本概念 (1)重载运算符是具有特殊名字的函数,它们的名字又operator和其后要定义的运算符号共同构成.. (2)对于一个运算符号来说它或者是类的成员,或者至少含有一个类类型的参数. (3)我们 ...
- 「C语言」数据类型及混合运算与类型转换
深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换. 本篇文章便是根据<C语言程序设计教程>和在线翻阅资料后整理而出.(练习题将逐步更新) 目录: ...
- C++ Primer 笔记——重载运算
1.对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数.除了重载的函数调用运算符operator()之外,其他重载元素运算符不能含有默认实参. class test { ...
- [C++ Primer] : 第14章: 重载运算符与类型转换
基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...
- 【C++】C++中重载运算符和类型转换
输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...
随机推荐
- 决策树在sklearn中的实现
1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...
- Vue 问题记录
Vue 问题记录 汇总日常开发中遇到的关于vue的问题 VeeValidator 语言设置 校验消息默认是英文的,定义中文或其他语言的错误提示消息 import VeeValidate from 'v ...
- tomcat部署web项目方法
一.tomcat部署web项目之静态配置: 方法一:直接将为web项目放到webapps下: 如图所示:在webapps文件下,存放了一个html文件,启动tomcat,访问http://localh ...
- java的foreach,后台弹框
for (String string : list) { if(string.equals(ids)){ int res = JOptionPane.showConfirmDialog(null, & ...
- 系统剪切板的使用UIPasteboard
最近发现支付宝和淘宝使用吱口令和淘口令的功能,就一直想怎么实现的,觉得应该是使用了系统的剪切板,然后查阅了资料做下笔记! 系统的剪切板主要是使用了UIPasteboard这个类. UIPasteboa ...
- C# 实现Excel读取接口写入数据
[Route("adm/getInfo")] [HttpGet] public string GetInfo() { var types = typeof(GCP.Server.W ...
- HTML5对表单的一些有意思的改进
HTML5对表单进行了许多的改进,在这篇文章中,我选择了其中个人认为很有趣的三个变化:自动聚焦,对button元素的改进,把表单元素与非父元素的form表单挂钩进行简单的介绍. 1. 自动聚焦 自动聚 ...
- java web中对json的使用
一.在Java Web的开发过程中,如果希望调用Java对象转化成JSON对象等操作.则需要引入以下jar包,不然运行时则报错. 1.commons-beanutils.jar 2.commons-c ...
- show status 查看各种状态
要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释: 如有问题,欢迎指正 状态名 作用域 详细解释 ...
- 创建<Bean>sessionFactory错误, init方法调用失败;嵌套异常是org.hibernate.exception。
未知原因:在Maven中hibernate映射开启了自动更新表,出现此异常 org.springframework.beans.factory.BeanCreationException: Error ...