文章目录

  • 运算符重载:
    • 1.1 = 运算符重载
    • 1.2 + 运算符重载
    • 1.3 && 运算符
    • 1.4 << 运算符(输出运算符)
    • 1.5 ++运算符
      • 前置 ++(仅对实部++)
      • 后置++(仅对实部++)
      • 函数的返回值为解引用?

运算符重载:

原因:为了增强程序的可读性,引入运算符重载。目的就是为了让自定义的类型能够像内置类型一样可以直接使用运算符计算。换可以使用C++中的运算符操作对象。

语法:返回值类型 operator 运算符 (形参列表)

1.1 = 运算符重载

当使用一个已存在的对象,给另外一个已存在的对象赋值的时候自动调动的成员方法。
如果没有实现,会自动生成一个浅拷贝的等号运算符重载。

person &operator=(const person& src){//防止自赋值if (this !=&src){//防止内存泄漏delete[] _name;//将被赋值的_name中的内存释放,重新申请。//防止浅拷贝_name = new char(strlen(src._name) + 1);memset(_name, 0, strlen(src._name)+1);for (int i = 0; i < strlen(src._name); i++){_name[i] = src._name[i];}_sex = src._sex;_age = src._age;}return *this;//打印一些说明调用了此函数cout << "void operator=(const person &src)" << endl;}
int main(void)
{char name[] = "baiU";person p1(name,1, 22);person p2;p2 = p1;//等同于:p2.operator=(p1);p2.show();return 0;
}

运行结果

结果显示
首先构造p1,接下来构造p2,在调用赋值运算符重载。析构p2,在析构p1。
注意
1.防止自赋值
2.防止内存泄漏
3.防止浅拷贝
如果成员属性中有指针。就绪要额外申请空间。防止浅拷贝。

1.2 + 运算符重载

  1. 返回类型为类的类型
  2. this指针声明为const
  3. 第二加数声明为const
 Complex operator+(const Complex &cx)const
Complex operator+(const Complex &cx)const{//int a = Real + cx.Real;//int b = Image+cx.Image;//调用了拷贝构造函数,将this和cx的和传给tmpComplex tmp(Real + cx.Real,Image+cx.Image);//return   Complex(Real + cx.Real,Image+cx.Image); //不需要调用拷贝构造函数,直接创建一个临时对象,将值写入到临时对象空间return tmp; //创建了一个临时对象,只析构一次}
  Complex p1(5, 6);Complex p2(7, 8);Complex p3 = p1 + p2;// Complex p4 = p1.operator+(p2);

1.3 && 运算符

比如要比较两个复数的实部是否等于0

bool operator &&(const Complex& cx)const{return Real && cx.Real;}

1.4 << 运算符(输出运算符)

把cout当做cout当做参数穿进去
使用特定的 ostream
//简易版本,只能当做show方法一样使用

   /* void operator<<(ostream& out){out << Real << "+" << Image << "i" << endl;}*/


无法使用cout直接输出

改进:将函数的返回值类型改为输出流对象,即ostream

 friend ostream& operator<<(ostream& out, const Complex& cx);
};
ostream &operator<<(ostream& out, const Complex& cx)
{out << cx.Real << "+" << cx.Image << "i" << endl;return out;
}

一次输出两个对象

 cout << p1<<p2 ;

1.5 ++运算符

前置 ++(仅对实部++)

前置++就是先+1,再返回
实现:只针对复数的实部

  1. 引用的方式返回函数的值,不能是局部变量,或局部对象
  2. 返回的是this指针的本身。
    用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本。
Complex& operator++(){++Real;return *this;}

后置++(仅对实部++)

先传值,再自增。
就是先把值给一个临时量。

 Complex operator++(int){int tmp = Real;++Real;return Complex(tmp,Image);}

函数的返回值为解引用?

  1. 当函数运算符重载返回的是对象时,会在连续赋值运算过程中,调用两次拷贝构造函数和析构函数,(return 创建一个新对象),而如果采用 引用的方式返回,就不需要在创建对象,因为return的就是已经存在的对象的引用(别名)。
  2. 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本
  3. 允许连续赋值
#include<iostream>
#include<string.h>
using namespace std;
class String
{private:char* str;int len;
public:String(const char* s);//构造函数声明String &operator=(const String& another);//运算符重载,此时返回的是对象void show(){cout << "value = " << str << endl;}/*copy construct*/String(const String& other){len = other.len;str = new char[len + 1];strcpy_s(str, len+1,other.str);cout << "copy construct" << endl;}~String(){delete[] str;cout << "deconstruct" << endl;}
};String::String(const char* s)//构造函数定义
{len = strlen(s);str = new char[len + 1];strcpy_s(str,len+1, s);
}String String::operator=(const String& other)//运算符重载
{if (this == &other)return *this;//        return;delete[] str;len = other.len;str = new char[len + 1];strcpy_s(str,len+1, other.str);return *this;//    return;
}int main()
{String str1("abc");String str2("123");String str3("456");str3 = str1 = str2;//str3.operator=(str1.operator=(str2))str3.show();str1.show();return 0;
}

如果以解引用的方式返回

String &String::operator=(const String& other)//运算符重载
{if (this == &other)return *this;//        return;delete[] str;len = other.len;str = new char[len + 1];strcpy_s(str,len+1, other.str);return *this;//    return;
}

  str3 = str1 = str2;//str3.operator=(str1.operator=(str2))

少执行了两次拷贝构造函数,因为返回的都是this的别名,因此是对str进行了修改买就可以完成连续赋值。

【C++】运算符重载/函数的返回值为解引用相关推荐

  1. C++运算符重载函数作为类成员函数和友元函数

    C++运算符重载函数作为类成员函数 1.1成员函数的重载运算符左侧是一个类对象,而且与运算符函数类型相同. 因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数和返回值类型相同,运算结果才 ...

  2. C++:运算符重载函数之成员运算符重载函数

    5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...

  3. 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...

  4. C++运算符重载函数

    运算符重载的函数 运算符重载的方法是定义一个"重载运算符的函数",在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算.也就是说,运算符重载是通过定义函数来实现的.运 ...

  5. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  6. C++运算符重载函数作为友元函数

    运算符重载函数作为友元函数 在前面的程序例子中对运算符"+"进行了重载,使之能用于两个字符串的相加.在该例中运算符重载函数 operator +(); 作为 my_string类中 ...

  7. keil5函数 默认返回值_C++ 函数的定义

    " C++对于函数的基本用法" 01 - 函数的定义 //函数声明:[返回值类型] [函数名称] (参数列表)int Function(int a, int b);//函数定义in ...

  8. python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...

    建议不是你不应该使用True,False或None.这只是你不应该使用如果x == True. 如果x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,取决于它 ...

  9. 【C++】之【运算符重载函数】

    /*__________________________________________________________________________________________________ ...

  10. 常成员函数函数和返回值为常量的函数

    常成员函数,它的形式是在成员函数后面加上const修饰,它是为了防止特定函数改变本类对象的数据成员而产生的,目的就是保护数据成员.在常成员函数中,你不能改变数据成员的值,你也不能在常成员函数中调用非常 ...

最新文章

  1. R语言获取当前R版本(version)实战
  2. 【Python-ML】聚类的性能评价指标
  3. windows相关知识点分析
  4. Java面向对象(1)--对象的创建使用类的实例化
  5. 转载 Net多线程编程—System.Threading.Tasks.Parallel
  6. android onserviceconnected_2019最新Android面试题
  7. linux查看后台执行的所有任务与对应的命令
  8. docker -v 覆盖了容器中的文件_Docker容器之安装Mysql
  9. 【ExtJS】关于alias和xtype
  10. 小微金融的常规策略架构与流程是什么?
  11. jsoncpp的安装与使用实战(windows交叉编译Ubuntu)
  12. 2017杭电ACM集训队单人排位赛 - 1(ALL题解)
  13. 破坏计算机系统信息罪司法解释,破坏计算机信息系统罪司法解释是怎样的的呢?...
  14. linux ubuntu 查看历史命令
  15. mc服务器tp到指定,我的世界怎么把别人tp到指定地点 | 手游网游页游攻略大全
  16. Kafka从上手到实践 - 庖丁解牛:Partition | 凌云时刻
  17. gentoo中文文档
  18. 坚果O1S画面竟然出现折边?对比同价位当贝D3X,坚果O1S值得入手吗?
  19. 顶级黑客分享的30个极简Python代码,拿走就能用!
  20. 解决磁盘占用率一直处在100%的方法之一

热门文章

  1. 电脑录屏怎么录?3个方法,教你如何录制视频
  2. 桌面上的计算机图标是一个,电脑桌面上计算机图标不见如何找回
  3. 华为云OBS数据桶使用
  4. 预应力内力计算时作用机理(纠结好久的问题orz)
  5. 史上最全运放运算放大器知识讲解
  6. OpenWrt固件刷入及相关实验
  7. python俄罗斯方块算法详解_python俄罗斯方块
  8. 《Windows 网络操作系统》集中实训任务书详解
  9. WSN基于自适应网格的多目标定位算法
  10. Java Foreach拉姆达表达式