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

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

本文关键字:变量 为什么 这样做 成员 访问      更新时间:2023-10-16

考虑以下代码片段:

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和类定义中被区别对待?main((中声明的"c"是否与被接受为参数的"other"相同?为什么这些行为不同?

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

见标准(强调矿(:

11会员访问控制

一个类的成员可以是

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

cor

return x+other.x

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


  1. 不过,正如@ChristianHackl评论的那样,有一些特殊规则

其他工作是因为您为类型cor定义了运算符+,在类cor的所有方法(public或private(中,您可以调用private和public成员。在这个运算符中,其他变量是相同类型的,所以根据这个规则,你可以调用其他.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[])
     ^