C++怎么访问私有变量和函数
用指针呀,了解C++内存结构的话。
1. 对于私有成员变量,可以用指针来访问。
2. 对于虚函数,也可以用指针来访问。
3. 另外,对于私有成员,如果摸不准地址构造,可以先构造一个结构相似的类,然后增加一个公有函数获得内容,然后指针转换,并且用公有函数来访问。
#include <stdio.h> class A
{
private:
char *str;
public:
A(): str("nothing"){};
}; class B
{
private:
char *str;
public:
B(): str("nothing"){};
char *get()
{
return str;
}
};
4. 最后,就是直接定义一个相似的类,然后把私有变成公有,然后强转指针来访问。
但是注意,只对变量有效,对函数无效。
#include <vector>
#include <iostream> using namespace std; class A {
public:
A(int i):a(i){}
private:
void print() {cout<<"A"<<endl;}
int a;
}; class B {
public:
void print() {cout<<"B"<<endl;}
int a;
}; int main() { A a();
B *b = (B*)&a;
b->print();
cout << b->a << endl; return ;
}
对于类函数(除了上面提到虚拟函数),想要访问,其实就要知道代码区的分布了吧。
那么A类的foo函数和B类的foo函数,如果参数列表一致,怎么区分它们呢?用A类的一个对象调用成员函数,这个成员函数用到成员变量,怎么知道是在用这个对象的数据呢?
这个解释,就是this指针。A类的foo(int,int)函数,已经被编译器编译成_foo_A*_int_int,也就是说隐含已经加入了函数所属类的信息,调用A类对象a.foo的时候,已经在调用foo(const A * this,int,int)这个函数。
这也解释了,为什么在成员函数内部,使用成员变量,有时候(并不是全部情况下都如此)前面加this和不加this没有区别,编译器已经把foo里面用到的成员变量,用this指针指向了。
C++怎么访问私有变量和函数的更多相关文章
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- Python访问私有变量
代码: class Counter(object): __secount=0 publicfs=0 def getcount(self): self.__secount+=1 self.publicf ...
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- .net 反射访问私有变量和私有方法
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- 给访问私有变量添加access method
class TestAccessPrivateVar{ private int a = 1; class MyInner{ /* synthetic final TestAccessPrivateVa ...
- 【JS笔记】私有变量
1.任何函数中定义的变量都可以认为是私有变量.函数内部可以访问,外部不能访问. 可以通过闭包创建特权方法访问私有变量. function Foo(){ var n=10; this.returnN=f ...
- JavaScript函数表达式、闭包、模仿块级作用域、私有变量
函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...
- Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...
随机推荐
- Git学习笔记 2,GitHub常用命令
廖雪峰Git教程 莫烦Git教程 莫烦Git视频教程 文件三个状态,add之后从工作区(原始状态)到暂存区,commit之后从暂存区到版本库 工作区 暂存区 版本库 unstage stage mas ...
- 【Henu ACM Round#20 F】 Arthur and Brackets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...
- Android编译环境配置
Android编译环境配置 网上关于Android编译环境配置的整理资料有不少,经整理亲测后,希望能给需要的亲们提供帮助. 主要分为四步: 1.安装JDK(Java Standard Edition ...
- 设置UITableViewCell高度的问题
有非常多时候.UITableViewCell每行的高度是不固定的,须要动态设置. UITableView有个代理方法, -(CGFloat)tableView:(UITableView *)table ...
- 三:redis的List类型相关操作
</pre><pre name="code" class="php" style="font-size: 14px;"&g ...
- Unix网络编程之环境搭建
环境搭建 在尝试UNP书上的样例时,会由于找不到"unp.h"等问题无法编译成功.因此在学习之前须要先搭建好编译环境. 步骤 <1>下载 UNIX网络编程源码unpv ...
- Gym - 100338C Important Roads 最短路+tarjan
题意:给你一幅图,问有多少条路径使得去掉该条路后最短路发生变化. 思路:先起始两点求两遍单源最短路,利用s[u] + t[v] + G[u][v] = dis 找出所有最短路径,构造新图.在新图中找到 ...
- java jframe关闭窗口
frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { i ...
- 及格的产品vs优秀的产品
类似的产品,做了同样的一个功能,但是,我们还是可以很明显的感受到不同,这种不同我们常常把他叫做「用户体验」. 来看看2组类似产品相似功能的设计: 识别到歌名vs还可以滚动展示歌词 在很早的时候就存在一 ...
- C# 之 继承
继承 继承是OOP最重要的特性之中的一个.不论什么类都能够从还有一个类中继承,这就是说,这个类拥有它继承的类的全部成员. 在OOP中,被继承的类称为父类. 在C#中的对象仅能直接派生于一个基类 ...