2
A
回答
3
在MEM ory水平,根本沒有保護。
這完全是爲了開發人員在代碼上工作,以幫助他們避免錯誤。
的位置例如:
#include <iostream>
using namespace std;
class Test
{
public:
Test() : x(10) {}
int getTest() { return x; }
private:
int x;
};
class Change
{
public:
int x;
};
int main() {
Test test; // x is 10
void* vp = &test;
Change* modify = (Change*)vp;
modify->x = 15;
cout << test.getTest(); // prints 15
return 0;
}
看到它在行動:http://ideone.com/MdDgUB
3
private
變量僅由編譯器生成private
。它們不位於unreachable
或protected
內存區域中。
您可以通過瀏覽內存如果對象結構是衆所周知的(有風險的,絕對不推薦訪問它們,但它證明是絕對沒有保障
由於它(https://ideone.com/RRsOkr)證明:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
publicAttr = 4;
privateAttr = 3;
}
int publicAttr;
private:
int privateAttr;
};
int main() {
A a;
std::cout << "Public attribute value is:" << a.publicAttr << std::endl;
void* aVoid = (void*) &a; // works, but char* is recommended (see comment)
aVoid += sizeof(int);
int privateAttrValue = *((int*) aVoid);
std::cout << "Private attribute value is:" << privateAttrValue << std::endl;
return 0;
}
這個程序的輸出兩個屬性值,即使一個不應該容易!
4
3
1
訪問修飾符如私有,公共和保護並不提供內存保護,任何水平。
相關問題
- 1. 如何在python中提供此訪問說明符保護?
- 2. 訪問說明符受保護和內部保護在C#之間有什麼區別#
- 3. python中的私有公共受保護訪問說明符
- 4. 訪問說明符和訪問修飾符有什麼區別?
- 5. 使用聲明修改派生類中的訪問說明符
- 6. 爲什麼在參數聲明中只能使用「register」存儲類說明符?
- 7. 爲什麼C++類沒有類似Java的訪問說明符?
- 8. 具有私人訪問說明符的C++派生類
- 9. 接口聲明的訪問說明符
- 10. 「此聲明在C++中沒有存儲類或類型說明符」
- 11. C語言中的聲明符說明符是什麼?
- 12. 在派生類中使用受保護的說明符
- 13. 訪問說明符在typedef和前向聲明上的作用
- 14. C#內部訪問說明符,
- 15. 指針在類和內存分配中訪問私有數組的聲明
- 16. 無法訪問在'A'類中聲明的受保護成員
- 17. 訪問修飾符和訪問說明符之間有什麼區別
- 18. (VB.NET)'VB6'沒有聲明。由於其保護級別,可能無法訪問
- 19. 此聲明沒有存儲類或類型說明符
- 20. VC++ - 該聲明沒有存儲類或類型說明符
- 21. 聲明沒有存儲類或類型說明符
- 22. 錯誤C2248:無法訪問私有成員在類中聲明
- 23. C2248:無法訪問在類中聲明私有成員
- 24. 不能訪問在'Soldier'類中聲明的私有成員
- 25. 通過COM interop在C#中訪問受保護的內存
- 26. 訪問說明符
- 27. 爲什麼有多個公共訪問說明符standard_layout的類?
- 28. Java中的私有訪問說明符用法繼承
- 29. 這條elif聲明說了什麼?
- 30. 在C++中聲明私有變量
我只想補充一點,編譯器允許以任意順序放置私有和公共成員塊,所以'aVoid'之後的下一個點可能在類之外 – NathanOliver
另外:用'void *'做算術不是標準允許的;爲此使用'char *'(另外,'int *'在這裏可能會更簡單)。見http://stackoverflow.com/a/3524270/1084944 – Hurkyl
@Hurkyl:有趣的,不知道。謝謝。 – jpo38