c++操作符重载,拷贝构造函数和友…
操作符重载
把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++操作符重载,拷贝构造函数和友…相关推荐
- C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现
http://blog.csdn.net/wangshihui512/article/details/9842225 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同 ...
- 运算符重载——拷贝构造函数与赋值运算符的区别、如何实现赋值运算符的深拷贝
目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 写在前面 1)C++的编译器会默认给一个类提供4个函数 默认构造函数(无 ...
- 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载
1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...
- C++ 类和对象(二):构造函数、析构函数、拷贝构造函数、运算符重载
构造函数 析构函数 拷贝构造函数 运算符重载 class Date {}; 可以看到,上面那个类没有任何成员,是一个空类,但是它真的什么都没有吗?其实一个类在我们不写的情况下,都会生成6个默认的成员函 ...
- 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则
文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...
- C++中的赋值操作符重载
文章目录 1 C++中的赋值操作符重载 1.1 赋值操作符重载 1 C++中的赋值操作符重载 1.1 赋值操作符重载 关于赋值操作符: 编译器为每个类默认重载了赋值操作符. 默认的赋值操作符仅完成浅拷 ...
- 你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数
6.2.4 拷贝构造函数 在C++世界中,除了需要使用构造函数直接创建一个新的对象之外,有时还需要根据已经存在的某个对象创建它的一个副本,就像那只叫做多利的羊一样,我们希望根据一只羊创建出来另外一只 ...
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- C++:拷贝构造函数与深/浅拷贝
浅拷贝只是增加了一个指针指向已存在的内存地址, 深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存, 拷贝后两者是同一个地址,则是浅拷贝,否则是深拷贝. 可以结合值传递和引 ...
最新文章
- 缓存服务器syns to listen sockets drop导致创建socket失败
- STM32开发 -- 4G模块开发详解(4)
- Keil升级了,Keil Studio 来了!
- 物联网(车联网)平台架构方案
- java图形旋转动画_Java动画:旋转图像
- Java StringBuffer
- Dao接口返回数组_JavaScript二进制数组(2)TypedArray视图
- Could not create local repository at /home/yizhenn/.m、IDEA倒入maven项目无法导报问题
- 如何在前端中使用protobuf(vue篇)
- 我的 HTTP/1.1 好慢啊!
- 永磁同步电机转速电流双闭环PI+MTPA+弱磁控制Simulink仿真模型
- 世界上最伟大最邪恶的软件发明
- 共阴数码管C语言单片机,51单片机直接驱动共阴极数码管
- 1789. 牛为什么过马路 II
- PyQt5 QtChart-曲线图
- 优美段落集锦(高中)——希望能帮助当年的“我们”
- 收下这份秘籍:如何提高投稿命中率
- axios+Vant+vue+jq重构jq月经周期计算器源代码(兼容移动端)
- 【学习python语法】
- wincc脚本打印斑马打印机条码,斑马打印机接口