操作符重载

操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是

那些操作符可以重载

除了下面几个操作符不能重载外,其它的操作符都能重载

  • .
  • ::
  • .*
  • ?:
  • 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++之旅:操作符重载的更多相关文章

  1. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  2. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  3. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  4. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  5. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  6. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

  7. C++基础学习笔记----第十三课(操作符重载-下)

    本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...

  8. 再议Swift操作符重载

    今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ...

  9. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

随机推荐

  1. Git------Commit和Push的区别

    转载:http://wenda.so.com/q/1435946424728324?src=140 git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库. git ...

  2. tableview直接滚动至最后一行

    类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用scrollToRowAtIndexPat ...

  3. Fragment遇到的坑

    Fragment不要通过构造传参,要么就是bundle,要么就通过activity临时存一下,不然debug编译没问题release编译不过

  4. dubbo项目实战代码展示

    最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...

  5. Android 全局异常处理(三)

    用过安卓手机的用户以及安卓开发者们会时长碰到程序异常退出的情况,普通用户遇到这种情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉.那么开发者们在开发过程中遇到这种情况给怎么办呢,当然,你不可能世界 ...

  6. Java switch 详解

    switch 语句由一个控制表达式和多个case标签组成. switch 控制表达式支持的类型有byte.short.char.int.enum(Java 5).String(Java 7). swi ...

  7. CodeForces 651 A Joysticks

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. 解决;R语言使用sqldf库是报错"Failed to connect to database: Error: Access denied for user '..'@'localhost' (using password: NO) Error in !dbPreExists : invalid argument type"

    原因:在使用sqldf时,不需要加载RMySQL库 解决方案:在控制台执行释放RMySQL库加载 detach("package:RMySQL", unload=T);

  9. RabbitMq入门与基本使用

    这两天工作项目中用到了rabbitmq,顺便学习了一下. RabbitMq主要的使用模式有三种:工作队列,发布订阅和RPC远程调用. 1.工作队列 生产者: using System; using R ...

  10. hashCode和equals方法的区别与联系

    hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等: (1)equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比 ...