C++多态之——虚表地址所在内存空间的位置

众所周知,虚拟地址空间划分成了好几个部分,有堆区、栈区、常量区、静态区......

(500条消息) C/C++代码内存分布图_程序分布图_橙予清的zzz~的博客-优快云博客icon-default.png?t=N6B9https://blog.youkuaiyun.com/weixin_69283129/article/details/126122989大家可以看这篇文章深入了解我们日常所写的C++代码都分布到了内存的哪些地方。

        我们可以模拟创建指向堆区空间、指向栈区空间的地址、创建存在于静态区和常量区的变量或常量,通过获取它们的地址就可以判断出虚表地址的大致位置到底处在内存的那一部分了。

试验案例: 

class A {
	virtual void Func1() {
		cout << "A:Func1()" << endl;
	}
	virtual void Func2() {
		cout << "A:Func2()" << endl;
	}
};

class B :public
### C++ 中指针的概念 #### 什么是指针? 指针是 C++ 中一个非常强大且灵活的特性,它允许程序员直接操作内存地址。通过指针可以直接访问和修改变量所在的内存位置,这使得数据处理更为高效,并能实现复杂程序设计中的许多功能[^1]。 #### 声明与初始化 声明一个指向特定类型的指针需要指定其基础类型并加上星号(*)作为修饰符: ```cpp int* p; // 定义了一个整型指针p double* q; // 定义了一个双精度浮点数指针q char* r; // 定义了一个字符指针r ``` 为了使指针有效工作,应该将其初始化为某个已定义的对象或分配给一个新的动态对象: ```cpp int a = 10; int* pa = &a; // 将pa设置成指向a float b = 20.5f; float* pb = new float; // 动态创建单个float, 并让pb指向该空间 *pb = b; ``` #### 访问指针所指向的内容 要获取指针实际存储的数据值,则需使用解引用运算符(*), 如下所示: ```cpp cout << *pa << endl; // 输出a的值 (即10) cout << *pb << endl; // 输出b的值 (即20.5) ``` 如果想要获得指针本身保存的地址而不是其所指向的位置上的数值,那么可以利用取址运算符(&): ```cpp cout << pa << endl; // 打印出pa这个指针本身的值(也就是&a的结果) cout << &pa << endl; // 显示的是pa所在栈上/堆里的具体物理地址 ``` #### 函数参数传递中的应用 当函数接受指针作为形参时,可以通过传入实参对应的指针来改变外部作用域内的原始数据副本而无需复制整个结构体或者大型数组等大尺寸实体;另外还可以返回多个计算结果而不局限于单一return语句所能携带的信息量限制. ```cpp void swap(int*& x, int*& y){ int temp=*x; *x=*y; *y=temp; } // 或者更简洁的方式如下: void swap(int& x,int& y){ std::swap(x,y); } int main(){ int m=3,n=7; swap(m,n); // 调用按引用方式交换两个整数 cout<<m<<" "<<n;// 结果应该是7 3 return 0; } ``` #### 智能指针简介 为了避免手动管理资源带来的风险(C语言风格的传统做法容易引发内存泄漏等问题),现代C++引入了智能指针的概念——自动跟踪对象生命周期并在适当时候释放关联资源的一种特殊类模板实例化形式.QScopedPointer 是 Qt 库提供的一种局部范围使用的智能指针解决方案之一[^2]. ```cpp QScopedPointer<MyClass> ptr(new MyClass()); MyClass *rawPtr = ptr.data(); if(rawPtr != nullptr){ rawPtr->doSomething(); } ``` 以上代码展示了如何安全地管理和使用自定义类 `MyClass` 的实例,即使发生异常也能确保及时清理不再需要的对象。 #### 高级主题:函数指针及其扩展 除了基本用途外,C++ 还支持高级特性的开发,比如函数指针可用于构建回调机制、模拟多态行为或是简化某些算法的设计思路。此外还有诸如 Lambda 表达式这样的增强版闭包语法糖可以帮助开发者写出更具表现力且易于维护的源码[^3]: ```cpp typedef void (*FuncType)(const string&); vector<FuncType> funcArray; funcArray.push_back([](const string& msg){ printf("%s\n",msg.c_str()); }); funcArray[0]("Hello from lambda!"); ``` 上述例子说明了怎样把匿名内联函数存放到容器里并通过索引调用来执行相应逻辑分支的操作过程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙予清的zzz~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值