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是函数对 ...
随机推荐
- Oracle拆分字符串,字符串分割的函数。
第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...
- hibernate 映射 数据库number 映射为 double 为空 报错问题
将 数据库表 映射成hibernate 实体类时 将number --- double 如果数据库中number 为空,查找数据时将报错 Can not set double field ***** ...
- django 外键操作
下面定义两个模型,一个主表,一个字表. 举例说明: 如何通过主表对象找到对应的子表对象? 如何通过子表对象找到对应的主表对象? class Person(models.Model); name = m ...
- 九.mysql数据库多实例安装mysqld_multi [start,stop,report]
经常应为系统硬件短缺,导致需要在同一台硬件服务器上面安装多个mysql实例.之前的文章四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码 ...
- 汇编试验一:查看CPU和内存,用机器码指令和汇编指令编程
预备知识: r命令查看,改变CPU寄存器的内容 2.D命令查看内存 3.E命令改写内存 两种方式: 1: 2: 内存中写入机器码 用T命令执行机器码(先将CS:IP指向要执行的内存处) 用a命令写汇编 ...
- 关于 Vue.js+Element-UI 日期控件 日期范围选择
理想效果 : 也就是说前面时间框的时间能选的范围应该小于等于后面的时间框; 后面时间框能选的范围应该大于等于前面的时间框; 示例代码 : 页面: <el-form-item label=&quo ...
- Git--将服务器代码更新到本地
1. git status(查看本地分支文件信息,确保更新时不产生冲突) 2. git checkout -- [file name] (若文件有修改,可以还原到最初状态; 若文件需要更新到服务器上, ...
- XCode: 如何添加自定义代码片段
转载自:http://rockonmycode.com/tips/xcode-code-snippets#more-185 我们经常会定义一些retain的property,而且大概每次我们都会像这样 ...
- Unity透明视频播放 所需的Shader脚本
Shader "Custom/ShaderMovie" { Properties { _MainTex("Color (RGB)", 2D) = "b ...
- lock free
#include <thread> #include <iostream> #include <mutex> #include <atomic> #in ...