c++之旅:操作符重载
操作符重载
操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类
那些操作符可以重载
除了下面几个操作符不能重载外,其它的操作符都能重载
- .
- ::
- .*
- ?:
- sizeof
操作符重载的本质
操作符重载的本质函数调用
#include <iostream>
#include <cstring>
using namespace std;
class MyString {
private:
char* str;
public:
MyString(const char* str) {
this->str = new char[100];
strcpy(this->str, str);
}
~MyString() {
delete []str;
str = NULL;
}
MyString(const MyString& myString) {
str = new char[100];
strcpy(str, myString.str);
}
MyString operator+ (const char* str) { // 对+操作符进行了重载
strcat(this->str, str); // 将传入的字符串拼接到原字符串后面
return *this;
}
void operator= (const MyString& myString) { //对=操作符进行了重载
strcpy(str, myString.str);
}
const char* get() {
return str;
}
};
int main(int argc, char* argv[]) {
MyString myString("abc");
myString = myString + "def";
cout << myString.get() << endl;
return 0;
}
MyString是一个类,在该类中对+操作符和=操作符进行了重载,main函数中的第二行代码将会被编译器翻译成下面的代码
myString.operator=(myString.operator+("def"));
从翻译过来的代码中我们可以看到实际就是函数调用,只不过函数比较特殊而已。其实我们可以完全在自己代码中直接写上面的代码,只不过可读性比较差且书写不方便
一元操作与二元操作
上面的代码中,我们只重载了=和+,且只接受一个参数,这使得+只支持一元操作。但是+操作本来是一个二元操作。简单的说,就是上面的代码只支持
myString + "def"
并不支持
"def" + myString
为了完善+操作功能,代码需要修改如下
#include <iostream>
#include <cstring>
using namespace std;
class MyString {
private:
char* str;
public:
MyString(const char* str) {
this->str = new char[100];
strcpy(this->str, str);
}
~MyString() {
delete []str;
str = NULL;
}
MyString(const MyString& myString) {
str = new char[100];
strcpy(str, myString.str);
}
MyString operator+ (const char* str) { // 对+操作符进行了重载
strcat(this->str, str); // 将传入的字符串拼接到原字符串后面
return *this;
}
void operator= (const MyString& myString) { //对=操作符进行了重载
strcpy(str, myString.str);
}
const char* get() {
return str;
}
friend MyString operator+ (const char* str, const MyString& myString);
};
MyString operator+ (const char* str, const MyString& myString) {
char* tmp = new char[100];
sprintf(tmp, "%s%s", str, myString.str);
return MyString(tmp);
}
int main(int argc, char* argv[]) {
MyString myString("abc");
myString = "def" + myString;
cout << myString.get() << endl;
return 0;
}
重载一元操作符一般写在类的方法里,而二元操作符一般写在类外面并将该操作符设置为类的友元方法。
操作符重载注意事项
- 操作符重载只针对类而言,一元操作符必须写到类的内部,二元操作符必须要有一个参数为类
- 操作符重载并不是全局的,只针对重载的类生效。比如对MyString的+重载了,那么+操作只对MyString有效,对其他的类无效
- 尽量少用操作符重载
c++之旅:操作符重载的更多相关文章
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- paip.操作符重载的缺失 Java 的一个大缺点
paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 操作符重载.xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++一些注意点之操作符重载
重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...
- C++基础学习笔记----第十三课(操作符重载-下)
本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...
- 再议Swift操作符重载
今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ...
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
随机推荐
- fly
购物车飞入效果 核心: 1,购物车与飞入圆点(或者图标)的定位关系 完整源码: <!doctype html> <html lang="zh"> <h ...
- Django学习笔记第四篇--数据处理URL和数据库
一.URL: 1.基础的URL与视图函数的映射 from django.conf.urls import url from django.contrib import admin from appna ...
- 170425、centos安装mysql5.6数据库
# rpm -qa | grep mysql ## 查看该操作系统上是否已经安装了 mysql 数据库, 有的话,可以通过 rpm -e 命令 或者 rpm -e --nodeps 命令来卸载掉 # ...
- Yii2.0在GridView中下拉过滤筛选的实现
Yii2.0在GridView中下拉过滤筛选的实现 细微的方便也许对于我们的用户来说将会获得最好的体验,用最方便,最快捷,最易操作的方式实现用户需要的功能是我们的工作和职责,今天分享一个在Yii2.0 ...
- WingIDE6.0神秘代码
python2: import string import random import sha BASE16 = '0123456789ABCDEF' BASE30 = '123456789ABCDE ...
- datetime 模块详解 -- 基本的日期和时间类型
转自:https://www.cnblogs.com/fclbky/articles/4098204.html datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出 在 ...
- Yii框架2.0的过滤器
过滤器是 控制器 动作 执行之前或之后执行的对象. 例如访问控制过滤器可在动作执行之前来控制特殊终端用户是否有权限执行动作, 内容压缩过滤器可在动作执行之后发给终端用户之前压缩响应内容. 过滤器可包含 ...
- vue系列
1.vue基础 2.vue请求和跨域 3.自定义全局组件 4.vue-router 5.Vuex
- PHP error_log 新认知
//error_log 简介及使用方法 // error_log("消息","类型","路径"); //message //type ...
- PCI 设备详解三
上篇文章已经分析了探测PCI总线的部分代码,碍于篇幅,这里另启一篇.重点分析下pci_scan_root_bus函数 2016-10-24 pci_scan_root_bus函数 struct pci ...