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++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
随机推荐
- connect() failed (111: Connection refused) while connecting to upstream, cli
php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 netstat -ant | grep 9000 没有运行为空,有运行显示 tcp 0 0 12 ...
- WebApi(6) 后台C#调用WebApi
https://www.cnblogs.com/cxd1008/p/6640015.html 今天来写一下后台C#代码如何访问webapi 这里使用HttpClient方法访问webapi也是很常用的 ...
- 第三篇:CUDA 标准编程模式
前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式编写,即使是调用库,库的底层也是这个模式实现的. 模式描述 1. 定义需要在 device 端执行的核函数.( 函数声明前加 ...
- 第九讲 C#练习题
1.接收一个整数N 如果N是正数就输出1·N 如果是负数就提示出错输出 由丰老师提供 -_-~ 2.编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案. ...
- js如何遍历并取出对象的属性名?
js如何遍历并取出对象的属性名? dataObj = {name : su,age : 26,height : 18cm }; for(var st in dataObj) {console.dir( ...
- java web页面跳转 总结
Servlet中forward和redirect的区别 forward方式:request.getRequestDispatcher("/somePage.jsp").forwar ...
- HDU4291—A Short problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4291 题目意思:求g(g(g(n))) mod 109 + 7,其中g(n) = 3g(n - 1) ...
- libxml_disable_entity_loader
w避免加载外部实体字符. http://php.net/manual/en/function.libxml-disable-entity-loader.php libxml_disable_entit ...
- PHP Version 7.0.13-0ubuntu0.16.04.1 mysql-server-5.7
https://zh.wikipedia.org/wiki/Linux发行版 一个典型的Linux桌面发行版包括一个Linux 内核,来自GNU的工具和库,和附加的软件.文档,还有一个窗口系统,窗口管 ...
- glibc-2.23_int_free_流程浅析