我有一個模板類
template<class T>
class MyClass
{
public:
MyClass() { privateField = 0; };
T getPrivateField() {
return privateField;
}
private:
T privateField;
};
以及一個以 MyClass 的實體作為引數的模板函式
template<class T>
T foo(MyClass<T> mc) {
return mc.privateField;
}
我可以在模板函式中看到 MyClass 的私有欄位,但實際上無法使用它,這讓我感到困惑。
這是欄位可見性的示例(螢屏截圖)
問題:
為什么我可以在模板函式中準確地看到 MyClass 的私有欄位,以及如何在我的代碼中禁用它(如果可能)?或者它就像 Visual Studio 的一個功能?
uj5u.com熱心網友回復:
private 將限制您的代碼對成員的訪問。
它不會使您的代碼的某些部分對可能對您撰寫的內容進行觀察的工具不可見。從個人密碼可能是私密的意義上說,它不是私密的。
uj5u.com熱心網友回復:
private 并不意味著它對外部完全隱藏,或者類之外的任何人都不應該知道它的存在。
考慮這個例子:
#include <iostream>
struct foo {
int x = 0;
};
struct bar : foo {
private:
int x = 0;
};
int main() {
bar b;
b.x = 0;
}
現在假設,main是由只知道所涉及類的公共部分的用戶撰寫的。他們無法理解為什么會收到錯誤訊息:
<source>: In function 'int main()':
<source>:15:7: error: 'int bar::x' is private within this context
15 | b.x = 0;
| ^
<source>:10:13: note: declared private here
10 | int x = 0;
| ^
不可否認,這是一個虛構的例子,bar可以認為是壞的。關鍵是如果您的 IDE 不顯示任何私有成員,它不一定會幫您一個忙。它們的存在與否會改變僅針對公共介面撰寫的代碼的含義。
uj5u.com熱心網友回復:
不要將可見性與訪問混淆。
考慮多載決議的行為方式:
class X {
private:
void f(int value);
public:
void f(double value);
};
如果我們嘗試從外部使用 int 呼叫 X::f() :
int main() {
X obj;
obj.f(1234);
}
我們仍然得到錯誤:
<source>:10:15: error: 'void X::f(int)' is private within this context
obj.f(1234);
我們絕對不希望 main 僅僅因為它無法訪問 X::f(int) 函式而呼叫 X::f(double) 。否則,訪問可能會從字面上改變程式的運行時含義。
C 將
- 從名稱查找構建多載集
- 執行解析度以選擇最佳匹配
- 驗證訪問
以該順序。即,在多載決議完成后檢查訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312588.html
上一篇:第一次使用可變引數函式
