访问类中的私有成员变量:为什么这样做?

时间:2015-07-26 16:32:46

标签: c++

请考虑以下代码段:

class cor {
    int x;

  public:
    cor();
    cor(int a) {
        x = a;
    }
    int operator +(cor other) {
        return x + other.x; // Allowed. 'other' accessing a private member
    }
    void getx() {
        cout << x; 
    }
};

int main() {
    cor a(5);
    cor b(10);
    cor c = a+b;
    cout << c.x; // ERROR. 'x' is a private member.
}

为什么私人&#39;成员访问在主要内部和内部定义内部区别对待?不是&#39; c&#39;在main()中声明与&#39;其他&#39;相同。被接受作为论点?为什么这些表现不一样?

2 个答案:

答案 0 :(得分:3)

访问修饰符是特定于类的,而不是特定于对象的 1

参见标准(强调我的):

  

11会员访问控制

     

班级的成员可以是

     

- long;也就是说,它的名称只能由声明它的

的成员和朋友使用。

     

...

private

cor

有效,因为return x+other.x 也有类型other

  1. 虽然有一些特殊规则,但 @ChristianHackl 发表了评论。

答案 1 :(得分:1)

其他工作原因是您为类型cor定义了operator +,在类cor(public或private)的所有方法中,您可以调用私有和公共成员。在此运算符中,其他变量属于同一类型,因此根据此规则,您可以调用other.x.在主要功能中,你不在这个范围内,所以这就是为什么这不起作用的原因。

另一件事(仅供参考)是你对两个对象执行+操作,结果返回int然后调用隐式构造函数

using namespace std;

class cor {

    int x;
public:
    cor();
    cor(int a)
    {
        cout << "Constructor " << a << endl;
        x = a;
    }
    int operator +(cor other)
    {
        return x+other.x; // Allowed. 'other' accessing a private member

    }
    void getx()
    {
        cout<<x;

    }

};

int main(int argc, char *argv[])
{
    cor a(5);
    cor b(10);
    cor c = a+b;
    //     cout<<c.x; // ERROR. 'x' is a private member.
    return 0;
}

结果:

Constructor 5
Constructor 10
Constructor 15

如果稍微修改一下这个来源

using namespace std;

class cor {

    int x;
public:
    cor();
    explicit cor(int a)
    {
        cout << "Constructor " << a << endl;
        x = a;
    }
    int operator +(cor other)
    {
        return x+other.x; // Allowed. 'other' accessing a private member

    }
    void getx()
    {
        cout<<x;

    }

};

int main(int argc, char *argv[])
{
    cor a(5);
    cor b(10);
    cor c = a+b;
    //     cout<<c.x; // ERROR. 'x' is a private member.
    return 0;
}

你会得到

main.cpp: In function 'int main(int, char**)':
main.cpp:37:14: error: conversion from 'int' to non-scalar type 'cor' requested
     cor c = a+b;
              ^
main.cpp: At global scope:
main.cpp:33:5: warning: unused parameter 'argc' [-Wunused-parameter]
 int main(int argc, char *argv[])
     ^