C/C++黑魔法-无限制访问私有属性

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君,第一时间获取最新推送。

发布了354 篇原创文章 · 获赞 80 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/nicai_xiaoqinxi/article/details/103774908