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

C++ 在类中访问私有成员变量:为什么这样做?,c++,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;

考虑以下代码段:

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.
}
类cor{
int x;
公众:
cor();
文书主任(内部助理){
x=a;
}
int运算符+(cor其他){
返回x+other.x;//允许。'other'访问私有成员
}
void getx(){

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

请参见标准(我的重点):

11个成员访问控制

类的成员可以是

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

cor

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


  • 尽管有一些特殊的规则,正如@ChristianHackl评论的那样

  • 因为您在cor类(public或private)的所有方法中为类型cor定义了运算符+,所以其他方法也适用您可以调用private和public成员。在此运算符中,其他变量的类型相同,因此根据此规则,您可以调用other.x。在main函数中,您超出此范围,因此这是无法工作的原因

    另一件事(仅供参考)是对两个对象执行+运算,结果返回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;
    }
    
    如果稍微修改一下这个源代码

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

    这不是一个私有变量的全部要点吗?你应该阅读更多关于类和包封的内容,这些内容是在每本C++书籍甚至在线教程中都包含的基本材料。你不能期望在不阅读大量教学材料的情况下理解编程语言。是的。但是在C中声明的“C”只是另一个对象,比如“其他”。“other”可以访问私有变量,而“c”不能。这让我很困惑。@a你有没有想过为什么有3个访问说明符(private、protected、public)在C++中?在这里进行探索。但是,对于<代码>保护< /C>访问,这不是严格的。标准定义了<代码>保护< /代码> Access(参见11.4)受保护成员访问(Access Access)的几个特殊规则。例如,以下访问将不起作用,因为Access不通过<代码> < <代码> >:代码>类基础。{protected:intx;};派生类:公共基{void f(Base&b){b.x=0;};
    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[])
         ^