簡體   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