操作符重载

把c++的操作符在自己的新函数中重新实现就是操作符重载。

可以在类里面以成员函数的方式重载某个操作符,也可以在某个名字空间中重载操作符。

--------------------------------------------------

以赋值操作符为例,函数的声明以及函数的调用

class A

{

public:

A& operator=(const A& a);

};

实现了这个函数之后,再 写代码

A a;

A b;

a = b;

则相当于 a.operator=(b) 被执行。

1,函数执行时,this对象是赋值操作符的左操作数,参数是右操作数, -- 这一点对于任何在类成员函数重载的有两个操作数的操作符都成立。

2,如果操作符是在名字空间中被重载,那么赋值操作符函数有两个参数,第一个参数是左操作数,第二个参数是右操作数。

--------------------------------------------------

A& operator=(const A& a)这个函数的实现:

A& A::operator=(const A& a)

{

要根据a的值来修改this对象的值,

然后返回this对象的引用。

}

需要注意的地方

1,如果this对象中有成员变量是指针,那么有两种选择需要程序员根据实际情况做决定,一种是直接指针赋值,第二种是释放掉this对象的该成员变量指针的内存,重新分配,再赋值。而对于拷贝构造函数,一般的实现都是选择第二种情况。

2,要检查a是否和this对象是同一个对象,如果是的,就什么也不用做。

--------------------------------------------------

赋值操作符重载之后,什么时候会被调用

1,对于已经的对象的赋值才会被调用

2,相反,如果对象还不存在,则是拷贝构造函数被调用,如

A a;

A b=a;

这时候其实是拷贝构造函数会被调用,而不是赋值操作符会be调用。

--------------------------------------------------

哪些操作符不能被重载

&&,||以及,

原因:布尔值的&&以及||符号的运算在c++中采用的是简化求值法,即:从左到右,只要布尔值的真假被确定,剩下的表达式是不用计算的。

例如 if(p && p->func()),按照c++的&&操作符的实现,如果p为空指针的时候,只会对p以及&&进行计算,而p->func()不会被计算。

但如果是以成员函数的形式重载了重载了&&操作符函数,那么相当于执行 p.operator&&(p->func()),此时参数会被求值。那么如果p是空指针,该代码执行就会触发异常。

--------------------------------------------------

友元成员函数

clas A

{

friend void fun(const A&);

};

void fun(const A& a)

{

//实现代码

}

友元成员函数能让该函数的代码访问A类型的成员变量。

--------------------------------------------------

为什么要用友元函数,而不是声明为成员函数

一般是不用友元的,但有时候只能用友元,比如operator<<,这是c++的输出操作符,

使用方式是

A a;

std::out << a;

如果类型A想要重新实现输出的行为,有三种选择,但只有友元这种是可行的

1,以成员函数的方式来定义operator<<(),问题是在操作符运算被执行的时候,this指针是左操作数,参数是右操作数,那么在std::out << a; a对象就是参数,而不是this指针,因此A类型所声明的成员函数不会被调用。

2,以全局的方式来声明定义operatr<<(ostream& out, const A& a),这时,在执行std::out << a 的时候,左操作数是第一个参数,右操作数是第二个参数,该函数“可以”被调用,但是,因为这个函数不是A类型的成员函数,它无法访问A类型的成员,因此这种方式不会通过编译,

3,那就是在2的基础上,将函数声明为A类型的友元函数了。

对于不同类型之间operator+运算也因为同样的原因需要声明为友元函数。

c++操作符重载,拷贝构造函数和友…相关推荐

  1. C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现

    http://blog.csdn.net/wangshihui512/article/details/9842225 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同 ...

  2. 运算符重载——拷贝构造函数与赋值运算符的区别、如何实现赋值运算符的深拷贝

    目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 写在前面 1)C++的编译器会默认给一个类提供4个函数 默认构造函数(无 ...

  3. 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载

    1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...

  4. C++ 类和对象(二):构造函数、析构函数、拷贝构造函数、运算符重载

    构造函数 析构函数 拷贝构造函数 运算符重载 class Date {}; 可以看到,上面那个类没有任何成员,是一个空类,但是它真的什么都没有吗?其实一个类在我们不写的情况下,都会生成6个默认的成员函 ...

  5. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  6. C++中的赋值操作符重载

    文章目录 1 C++中的赋值操作符重载 1.1 赋值操作符重载 1 C++中的赋值操作符重载 1.1 赋值操作符重载 关于赋值操作符: 编译器为每个类默认重载了赋值操作符. 默认的赋值操作符仅完成浅拷 ...

  7. 你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数

    6.2.4  拷贝构造函数 在C++世界中,除了需要使用构造函数直接创建一个新的对象之外,有时还需要根据已经存在的某个对象创建它的一个副本,就像那只叫做多利的羊一样,我们希望根据一只羊创建出来另外一只 ...

  8. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

  9. C++:拷贝构造函数与深/浅拷贝

    浅拷贝只是增加了一个指针指向已存在的内存地址, 深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存, 拷贝后两者是同一个地址,则是浅拷贝,否则是深拷贝. 可以结合值传递和引 ...

最新文章

  1. 缓存服务器syns to listen sockets drop导致创建socket失败
  2. STM32开发 -- 4G模块开发详解(4)
  3. Keil升级了,Keil Studio 来了!
  4. 物联网(车联网)平台架构方案
  5. java图形旋转动画_Java动画:旋转图像
  6. Java StringBuffer
  7. Dao接口返回数组_JavaScript二进制数组(2)TypedArray视图
  8. Could not create local repository at /home/yizhenn/.m、IDEA倒入maven项目无法导报问题
  9. 如何在前端中使用protobuf(vue篇)
  10. 我的 HTTP/1.1 好慢啊!
  11. 永磁同步电机转速电流双闭环PI+MTPA+弱磁控制Simulink仿真模型
  12. 世界上最伟大最邪恶的软件发明
  13. 共阴数码管C语言单片机,51单片机直接驱动共阴极数码管
  14. 1789. 牛为什么过马路 II
  15. PyQt5 QtChart-曲线图
  16. 优美段落集锦(高中)——希望能帮助当年的“我们”
  17. 收下这份秘籍:如何提高投稿命中率
  18. axios+Vant+vue+jq重构jq月经周期计算器源代码(兼容移动端)
  19. 【学习python语法】
  20. wincc脚本打印斑马打印机条码,斑马打印机接口

热门文章

  1. 2022第十届深圳国际物联网展览会
  2. python+vue校园足球联赛管理系统django源码
  3. Jeesite Login 登录 分析
  4. html dom反选,Dom操作--全选反选
  5. 基于STM32F103智能小车黑线寻迹运动实验(有代码)
  6. 首页滑滑滑,支付宝穿越回年轻样子
  7. Java实现第九届蓝桥杯付账问题
  8. 如何使用DiVa测试UDS On DoIP
  9. GM65条形码二维码扫描识别模块与STM32学习
  10. 【LuKS】Vba开发从入门到精通 =.=