[英]const reference public member to private class member - why does it work?
[英]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
。
其他工作,因為您為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.