繁体   English   中英

访问类中的私有成员变量:为什么起作用?

[英]Accessing private member variables within a class: Why does this work?

考虑以下代码片段:

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.
}

为什么在主类和类定义中对“私有”成员访问进行不同的处理? 在main()中声明的'c'是否与作为参数接受的'other'相同? 为什么这些行为有所不同?

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

参见标准(强调我的):

11会员访问控制

班级成员可以是

private 也就是说,它的名称只能由声明它的类的成员和朋友使用。

....

cor

return x+other.x

是有效的,因为other也具有类型cor


  1. 但是有一些特殊的规则,如@ChristianHackl所评论。

其他工作,因为您为cor类型定义了operator +,因此在cor类的所有方法(公共或私有)中,都可以调用私有成员和公共成员。 在此运算符中,其他变量具有相同的类型,因此根据此规则,您可以调用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[])
     ^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM