C++的private用于限制成员或函数的可见性,主要是为了避免误用和降低维护成本。
有些人却认为,我的就是我的,不要你觉得,我要我觉得。即使不能直接访问私有成员,我也要找其他的方式来访问。来看看有哪些访问私有属性的方法吧。
通过编译参数开启
-fno-access-control
是gcc编译器选项,可以直接开启访问私有属性大门。主要多用于单元测试。
通过对象的偏移地址访问
C++的对象可以看作是一个指针数组。这个指针数组存放的是对象的虚函数表和数据成员的地址。既然是指针数组,当然可以通过指针来访问对象的任何成员。如例子:
class Test
{
public:
void print()
{
printf("%d %d %d\n", m_a, m_b, m_c);
}
private:
int m_a;
int m_b;
int m_c;
};
int main(int argc, char *argv[])
{
Test t;
int *a = (int *)&t+0; /* m_a的地址 */
int *b = (int *)&t+1; /* m_b的地址 */
int *c = (int *)&t+2; /* m_c的地址 */
*a = 10;
*b = 20;
*c = 30;
t.print();
return 0;
}
输出:
10 20 30
使用宏替换
使用下列宏用来把private
关键词替换为public
从而开启访问私有属性的大门。
#define private public
一些观点
似乎有些人认为,类中的public,protected,private是理所当然存在的,说编程上的类可以模拟生活中的事物。Qt君认为其实不然,为什么会制造出访问级别,主要是限制用户乱用。但是即使有这种机制也会架不住用户不懂的乱用。
关注公众号Qt君,第一时间获取最新推送。
网友评论