为了账号安全,请及时绑定邮箱和手机立即绑定

为什么临时对象可以直接访问到私有成员?

代码如下:

头文件:

class Coordinate {

    // 利用友元函数进行+号重载
    friend Coordinate operator+(const Coordinate c1,const Coordinate c2);

public:
    // 构造函数,带初始化参数
    Coordinate(int x,int y);

    int getX();
    int getY();

private:
    // 私有属性
    int m_iX;
    int m_iY;
};

cpp文件:

#include "Coordinate.h"

Coordinate operator+(Coordinate c1,Coordinate c2){

    Coordinate temp(0,0);

    temp.m_iX = c1.getX() + c2.getX();
    temp.m_iY = c1.getY() + c2.getY();

    return temp;
}

为何这里可以直接使用 temp.m_iX ?

正在回答

4 回答

看错了,以为是成员重载

0 回复 有任何疑惑可以回复我~

楼主你理解错了,你把友元声明删调同样可以,就是operaor是成员函数,成员函数可以访问自己的任何对象,但是类外定义的对象除了用公用接口函数调用私有成员,不可以访问类的私有成员,你把基本的定义多看看,

0 回复 有任何疑惑可以回复我~

当天晚上和别人说到这个问题的时候想到答案了,等了2天也没有答案,那我就自己说一下吧。

顺带一说,对象直接访问自己的私有成员绝对是错的。需要借助友元类/友元函数类自己的成员函数进行访问。

问题答案:

我们在Coordinate类中声明了友元函数operator+(),友元函数在访问权限上和类内函数比较相似,可以对这个类的所有数据成员进行访问。

下面用代码来举例:

// 验证友元函数中创建的对象是否可以访问自己的私有成员。
// 结论:可以

#include <iostream>

using namespace std;

class hehe{

    // hehe类的友元函数
    friend void heheFriend(hehe &h);

public:
    int getxx(){ return xx; }
    int getyy(){ return yy; }
private:
    int xx;
    int yy;
};

void heheFriend(hehe &h){

    // 友元函数可以访问类的所有成员,包括私有
    h.xx = 1;
    h.yy = 2;

    // 友元函数中创建的对象可以访问自己的私有成员
    hehe h2;
    h2.xx = h.xx;
    cout << "h2.xx = " << h2.xx << endl;
}


int main() {

    hehe h1;

    // 无法直接访问私有成员
    //h1.xx; // 错误提示:'xx' is a private member of 'hehe'
    //h1.yy; // 错误提示:'yy' is a private member of 'hehe'

    // 调用友元函数,进行函数成员赋值
    heheFriend(h1);
    cout << "h1.xx = " << h1.getxx() << endl;

    return 0;
}
/*
 * 输出结果:
 * h2.xx = 1
 * h1.xx = 1 
 */



0 回复 有任何疑惑可以回复我~

通俗点讲自己访问自己的东西有何不可,临时对象temp是Coordinate类,自己访问自己的私有成员当然可以

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之模板篇
  • 参与学习       91174    人
  • 解答问题       318    个

本C++教程力求即学即会,所有知识以实践方式讲解到操作层面

进入课程

为什么临时对象可以直接访问到私有成员?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信