首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C/C++黑魔法-无限制访问私有属性

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

作者头像
Qt君
发布2020-02-10 11:48:07
发布2020-02-10 11:48:07
1.4K0
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

C++的private用于限制成员或函数的可见性,主要是为了避免误用和降低维护成本。

  有些人却认为,我的就是我的,不要你觉得,我要我觉得。即使不能直接访问私有成员,我也要找其他的方式来访问。来看看有哪些访问私有属性的方法吧。

通过编译参数开启

-fno-access-control是gcc编译器选项,可以直接开启访问私有属性大门。主要多用于单元测试

通过对象的偏移地址访问

  C++的对象可以看作是一个指针数组。这个指针数组存放的是对象的虚函数表和数据成员的地址。既然是指针数组,当然可以通过指针来访问对象的任何成员。如例子:

代码语言:javascript
复制
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;
}

  输出:

代码语言:javascript
复制
10 20 30

使用宏替换

  使用下列宏用来把private关键词替换为public从而开启访问私有属性的大门。

代码语言:javascript
复制
#define private public

一些观点

  似乎有些人认为,类中的public,protected,private是理所当然存在的,说编程上的类可以模拟生活中的事物。Qt君认为其实不然,为什么会制造出访问级别,主要是限制用户乱用。但是即使有这种机制也会架不住用户不懂的乱用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过编译参数开启
  • 通过对象的偏移地址访问
  • 使用宏替换
  • 一些观点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档