文档章节

友元与重载

爱看博客
 爱看博客
发布于 2015/10/22 10:02
字数 903
阅读 3
收藏 0

【本文部分内容来自网络】

    1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中有两个参数对单运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运算符函数参数表中含有一个函数。这个问题要搞清楚,有一个this指针的问题。。。

    2.双目运算符一般可以用友元函数重载和成员函数重载,但有一种情况只可以用友元函数重载,就是:双目运算符左边的变量是一个常量,而不是对象!!!也就是说 :=赋值运算符,()函数调用运算符,[]下标运算符,->通过指针访问成员的运算符能通过成员函数重载。

接下来解释一下为什么这四个运算符不能通过友元重载

先看一段测试程序:

#include <iostream>

using namespace std;

class A

{

private:

    int x;

public:

    A(){x = 10;}

    A(int y)

    {

        cout << cout<<"Call A(int xx)"<<endl;

        x = y;

    }

    A operator=(int xx)   //重载赋值运算符运算
     {

            cout<<"Call A operator=(int xx)"<<endl;

           x = xx;
            return *this;
      }

};

int main (void)

{

    A a;

    a =5;

return 0;

}

程序运行结果:
Call A operator=(int xx)


在此,我们可以对C++规则做出以下的判断:
 当类中没有定义赋值运算符重载成员函数时(注意,在未定义形参数据类型为该类类型的赋值运算符重载函数时,编译器会自动生成加入),当程序执行到某一赋值语句时,程序就会调用与赋值语句中右值类型匹配的构造函数,而把这右值当作此构造函数的实参。像最初的赋值语句a =5,执行时,实际做的操作是a(5)。而当类中有定义赋值运算符重载成员函数,执行赋值语句时,程序就只会去调用相应的赋值运算符重载函数。


 我们知道友元函数不是类的成员函数,它只是具有访问声明的类的数据成员的权限而已。

那么当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。
1、因为类中并没有重载赋值运算符的成员函数,所以它根据C++的规则,会去调用相应的构造函数。
2、但是在全局里,我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋值语句刚好和这函数匹配上了,根据C++的规则,也会去调用这函数。

同理,()函数调用运算符,[]下标运算符,->通过指针访问成员的运算符,也是一样。


如下声明:

A operator+(const A &t) const;

可以以同样意思的原型

friend Aoperator+(const A &t1, const A &t2);

这里,对于成员函数重载来说,一个操作数通过this指针隐式传递,另一个操作数做为参数传递;对于友元版本来说,两个操作数都做为参数传递。

然而在函数定义时,只能选择其中一种格式,原因同上面分析的一样,两种格式都与同一个表达式匹配会造成二义性错误


版权声明:本文原创,转载请注明来自 http://kymjs.com/

本文转载自:http://blog.csdn.net/kymjs/article/details/8818675

共有 人打赏支持
爱看博客
粉丝 5
博文 103
码字总数 23887
作品 0
深圳

暂无文章

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
3
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部