操作符重载

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

那些操作符可以重载

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

  • .
  • ::
  • .*
  • ?:
  • 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. connect() failed (111: Connection refused) while connecting to upstream, cli

    php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 netstat -ant | grep 9000 没有运行为空,有运行显示 tcp 0 0 12 ...

  2. WebApi(6) 后台C#调用WebApi

    https://www.cnblogs.com/cxd1008/p/6640015.html 今天来写一下后台C#代码如何访问webapi 这里使用HttpClient方法访问webapi也是很常用的 ...

  3. 第三篇:CUDA 标准编程模式

    前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式编写,即使是调用库,库的底层也是这个模式实现的. 模式描述 1. 定义需要在 device 端执行的核函数.( 函数声明前加 ...

  4. 第九讲 C#练习题

    1.接收一个整数N 如果N是正数就输出1·N 如果是负数就提示出错输出 由丰老师提供 -_-~ 2.编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案. ...

  5. js如何遍历并取出对象的属性名?

    js如何遍历并取出对象的属性名? dataObj = {name : su,age : 26,height : 18cm }; for(var st in dataObj) {console.dir( ...

  6. java web页面跳转 总结

    Servlet中forward和redirect的区别 forward方式:request.getRequestDispatcher("/somePage.jsp").forwar ...

  7. 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) ...

  8. libxml_disable_entity_loader

    w避免加载外部实体字符. http://php.net/manual/en/function.libxml-disable-entity-loader.php libxml_disable_entit ...

  9. PHP Version 7.0.13-0ubuntu0.16.04.1 mysql-server-5.7

    https://zh.wikipedia.org/wiki/Linux发行版 一个典型的Linux桌面发行版包括一个Linux 内核,来自GNU的工具和库,和附加的软件.文档,还有一个窗口系统,窗口管 ...

  10. glibc-2.23_int_free_流程浅析