C++对象的私有成员是禁止类外的访问的。但是我们仍然可以通过指针访问C++对象的私有成员。

#include <iostream>
using namespace std; class A
{
public:
A(int i = )
:m_i(i)
{}
void print()
{
cout << "m_i" << this->m_i << endl;
}
private:
int m_i;
}; int main(int argc, char **argv)
{
A a();
// 初始化后的a的私有变量是10
a.print(); //可以通过指针访问a中的m_i变量
int *pi = (int *)&a;
cout << "a::m_i: " << *pi << endl; //通过指针更改m_i
*pi = ;
//我们看到对象a中的私有变量m_i已经被改变
a.print();
return ;
}

运行结果:

m_i:
a::m_i:
m_i:

在上面代码中,a对象有一个私有的数据成员m_i,原则上在类外部是不能对m_i进行访问的。但是我们可以通过地址访问对象的私有数据成员m_i。并且还对其进行了修改。运行结果也表明我们确实可以通过指针访问对象的私有成员并且可以对其进行修改。

究其原因,在C++中访问对象的数据成员,可以根据数据在对象中的偏移地址访问。C++的对象其实就是一个指针数组。这个指针数组存放的是对象的虚函数表和数据成员的地址,我们当然可以通过指针访问对象的任何成员。我想着可能是C++为了兼容C语言而留下的一些不是很安全的做法。

通过指针访问C++对象的私有成员的更多相关文章

  1. C++之在类内部访问对象的私有成员

    一.引言 今天看项目里的一段代码发现,竟然可以再类的成员函数中访问该类的对象的私有成员.感觉不可思议. 自己写的实例代码: #include <iostream> using namesp ...

  2. C++中内部类访问外部类的私有成员

    首先,如果不知道什么是内部类InnerClass的话,就没必要往下看了. 尝试在C++中模仿apple objective-c 的Grand Dispatch简化多线程编程时,使用了boost::fu ...

  3. C#箴言之用属性来访问类的私有成员

    在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问. ...

  4. CPP-基础:关于私有成员的访问

    a.C++的类的成员函数中,允许直接访问该类的对象的私有成员变量. b.在类的成员函数中可以访问同类型实例的私有变量. c.拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员. d.类的成 ...

  5. 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数

    我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...

  6. C#中访问私有成员

    首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...

  7. 使用C#反射机制访问类的私有成员【转】

    首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...

  8. c++中嵌套类,外部类访问内部类的私有成员变量

    在嵌套类中,内部类可以直接访问外部类的私有成员变量,但是外部类不能直接访问内部类的私有成员变量,必须把外部类声明为内部类的友元类 /********************************** ...

  9. C#中访问私有成员--反射

    首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...

随机推荐

  1. fcc html5 css 练习1

    font-size:  字号 利用link导入新字体再引用<link href="https://fonts.gdgdocs.org/css?family=Lobster" ...

  2. Python爬取贴吧中的图片

    #看到贴吧大佬在发图,准备盗一下 #只是爬取一个帖子中的图片 1.先新建一个scrapy项目 scrapy startproject TuBaEx 2.新建一个爬虫 scrapy genspider ...

  3. Anaconda——Python包管理工具

    Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能 主要用于Python包管理和版本管理. 下载地址:https:/ ...

  4. 转:selenium自动化脚本错误总结

    https://blog.csdn.net/zxy987872674/article/details/53141118

  5. Centos 编译安装Haproxy

    一.环境介绍 1.Centos6 2. haproxy-1.4.25.tar.gz 二.安装 $ curl -O http://haproxy.1wt.eu/download/1.4/src/hapr ...

  6. lsof command not found 解决

    有些centos 没有 lsof命令,需要安装 yum install lsof -y 使用: lsof -i:端口号

  7. Requests库 更新中

    1.获取网页内容 --- requests库 <需理解HTTP协议> >requests库的7个主要方法   方法 说明 requests.requests() 构造一个请求,支撑一 ...

  8. 环形缓冲区: ringbuf.c

    #cat aa.c /*ringbuf .c*/ #include<stdio.h> #include<ctype.h> #define NMAX 8 int iput = 0 ...

  9. UNIX C XSI_IPC对象、共享内存

    1.创建IPC对象 #include <sys/ipc.h> key_t ftok(const char* pathname,int proj_id); 成功返回可用于创建或获取IPC的键 ...

  10. ORM 操作

    官方文档 一.操作 基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') # 增加一条数据,可以接受字典类型数据 **kwargs obj = mo ...