关于访问C++类对象中私有成员变量的方法,不考虑用友元
2011-10-19 21:45
483 查看
晚上看到群里有人问这样的题目:
要求不用友元,不在这个类里添加任何代码,把成员变量k的值改为100,结果自然是通过公共成员函数GetValue来验证。
实现如下:
class a { public: void GetValue() {cout<<k<<endl;} private: int k; };
要求不用友元,不在这个类里添加任何代码,把成员变量k的值改为100,结果自然是通过公共成员函数GetValue来验证。
实现如下:
class a { public: void GetValue() {cout<<k<<endl;} private: int k; }; int main() { a x; a *p=&x; *((int *)p)=100; cout<<&x<<endl; x.GetValue(); return 0; }
没有用c++中的强制转换符,c中的强制转换个人更加倾向。
实现原理:对象地址就是第一个成员变量的地址。
C++编译器将数据和程序段分开,所有的类变量会按照声明顺序依次存入数据段,所以,如果知道了第一个变量的地址,那么后面的地址也就依次累加 即可逐一求出了。有了变量地址,那么也就可以对它的值进行修改了。
比如:
class A { public: int i; void setJ(int _j){j = _j;}; int getJ() const {return j;}; private: int j; };
int main() { A a; a.setJ(2); printf("修改前j的值%d.n",a.getJ()); // 打印修改前j的值。 int *p = (int *)(int(&a) + sizeof(a.i)); *p = 10; printf("修改后j的值是%d.n",a.getJ()); // 打印修改后j的值。 }
相关文章推荐
- 访问C++类对象中私有成员变量的方法
- 通过操作地址的方法来访问C++类对象中私有成员变量
- 访问C++类对象中私有成员变量的方法
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- php 给对象私有及受保护的成员变量赋值的几种方法
- 同一个类的不同对象,对象的成员函数可以互相访问各自对象的私有变量和私有成员函数
- 不用友元,访问类的私有成员变量的方法
- 关于对象不能直接访问私有成员的超级大误区~
- C++ 通过对象方式 、指针方式两种方式去访问成员变量(属性或者方法)
- 关于类成员函数中访问同类对象的私有成员
- 为什么一个对象调用的类方法可以访问该类其他对象的私有成员
- 关于类成员函数中访问同类对象的私有成员
- 不用友元,访问类的私有成员变量的方法
- 关于类成员函数中访问同类对象的私有成员
- javaScript【创建对象、创建类、成员变量、方法、公有和私有、静态】
- JAVA反射机制 访问对象私有变量和方法
- c++中类对象不能访问类的私有成员变量
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
- Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到的值然后返回POJO对象呢?
- C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量