C++ private访问限制

2021-01-18 17:14

阅读:745

标签:方法   大量   内存布局   访问内存   tcl   关注   空间   main   names   

了解C++的同学都很清楚,C++有3个访问控制符,提供了对数据的封装,分别是public、protected与private。

private算是对数据保护得最严实的控制符了,一般都会说到private成员只能被类本身的成员函数以及类的友元访问,其他函数需要访问时,

大多数会封装一个public的set和get方法进行访问,或者 返回指针与引用也是可以的,但并不推荐,毕竟这样不利于封装的特性,

当然,下面介绍的方法是进行讨论使用其他方式突破private的访问限制,一般情况下也不会使用。

那么先从代码开始吧。

 1 #include  2 
 3 using namespace std;
 4 class TestClass
 5 {
 6 public:
 7     TestClass() : m_nA(1), m_nB(2), m_nC(3) {};
 8     ~TestClass() {};
 9     void PrintValue()
10     {
11         cout "m_nA: " "\t" "m_nB: " "\t" "m_nC: " 
12              endl;
13     }
14 private:
15     int m_nA;
16     int m_nB;
17     int m_nC;
18 };
19 int main()
20 {
21     TestClass Test;
22     Test.PrintValue();
23 
24     cout "---------------------------------------------------"  endl;
25     
26     int nValue = 7;
27     int* ptr = (int*)(&Test);
28     *(ptr++) = nValue++;
29     *(ptr++) = nValue++;
30     *(ptr++) = nValue++;
31 
32     Test.PrintValue();
33 
34     return 0;
35 }

 

当声明了一个Test对像时,那么系统将会开辟一段连续的空间,此对象将会有如下的内存布局,如何正确的访问,需要考虑到字节的对齐。

技术图片

 

 

 

 有了内存空间,当然可以使用指针进行访问,那么强行对此内存地址赋值即可。

27~30行的操作就是如此。

简单的总结来说,访问说明信息通常是在编译期间消失,在程序运行期间,对象变成了一个存储区域,别无他物,

因此,如果有人想破坏这些规则并且直接访问内存中的数据,是很容易的(存在大量的数据,继承时,使用此方法精确的更改数据内容就会变得非常困难),

C++并不能防止这种不明智的操作,毕竟C++关注的焦点是抽象。

 

那么除此之外还有其他方法吗?

答案是有的

比如声明另一个classB,只需要在classB中,把classA的private的访问控制符更改为public。

此时,相应的对象B与对象A的内存布局是一致的,只是访问限制不同,所以可以利用访问对象B的规则去访问对象A。

一个指向B对象的指针实际指向了一个A对象,对B中public成员变量的访问实际上是对A对象中private成员变量的访问。

 1 #include  2 
 3 using namespace std;
 4 class TestClass
 5 {
 6 public:
 7     TestClass() : m_nA(1), m_nB(2), m_nC(3) {};
 8     ~TestClass() {};
 9     void PrintValue()
10     {
11         cout "m_nA: " "\t" "m_nB: " "\t" "m_nC: " 
12              endl;
13     }
14 private:
15     int m_nA;
16     int m_nB;
17     int m_nC;
18 };
19 
20 class TestClassB
21 {
22 public:
23     TestClassB() : m_nA(11), m_nB(22), m_nC(33) {};
24     ~TestClassB() {};
25     void PrintValue()
26     {
27         cout "m_nA: " "\t" "m_nB: " "\t" "m_nC: "
28              endl;
29     }
30 public:
31     int m_nA;
32     int m_nB;
33     int m_nC;
34 };
35 
36 int main()
37 {
38     TestClass a;
39     TestClassB* b = (TestClassB*)&a;
40     a.PrintValue();
41     b->m_nA = 6;
42     b->m_nB = 9;
43     cout "m_nA:" m_nA  endl;
44     cout "m_nB:" m_nB  endl;
45     a.PrintValue();
46     return 0;
47 }

技术图片

 

C++ private访问限制

标签:方法   大量   内存布局   访问内存   tcl   关注   空间   main   names   

原文地址:https://www.cnblogs.com/XavierJian/p/12912660.html


评论


亲,登录后才可以留言!