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

本文详细介绍了C++操作符重载的概念、赋值操作符的实现、不能被重载的操作符、友元成员函数的使用以及为什么某些操作符需要使用友元函数的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作符重载

把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+运算也因为同样的原因需要声明为友元函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值