栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

转码基本功

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

转码基本功

转码基本功
  • 前言
  • 一、虚函数与纯虚函数
    • 1.虚函数与纯虚函数的概念
    • 2.虚函数要加override
    • 3.虚析构函数
  • 二. 内存四区
    • 2.1 程序运行前
    • 2.2 程序运行中


前言

例作为传统的车辆工程的学生,转码之路可谓艰辛。本章博客记录转码过程遇到的C++基本知识,作为日后复习用。


一、虚函数与纯虚函数 1.虚函数与纯虚函数的概念

虚函数是实现多态的基础。如下所示,fun1是虚函数,func2是纯虚函数。
多态是指:不同类的对象对同一消息的不同响应。
动态绑定是指:根据不同的条件将基类指针指向不同的派生类。

class base {
public:
	virtual void func1() {
		cout << "11" << endl;
	};
	virtual void func2() = 0;
};
class child {
public:
	virtual void func1() {
		cout << "22" << endl;
	};
	virtual void func2() {
		cout << "33" << endl;
	};
};

如果没有func2,基类是可以实例化的。有纯虚函数的类不可以实例化。

base *p = new base();

只有通过基类指针或引用调用虚函数时,才会发生动态绑定。

child c;
base *p = &c;  // 基类指针
base &ref = c; // 基类引用
2.虚函数要加override

在派生类重写虚函数时,要加override,表示你一定重载的是某个基类的函数。

virual void fun() override {};
3.虚析构函数

一般派生类在执行构造函数时,先执行基类,再执行子类。
若析构函数不是虚函数,则delete时,仅调用基类的虚构函数,子类的虚构函数不会调用。因此要将基类的析构函数声明为虚函数,才能先调用基类,再调用子类。

base *p = new child();
delete(p);
// 执行结果如下
// base() -> child() -> ~child() -> ~base()
二. 内存四区

内存四区我个人觉得内容不难。

2.1 程序运行前

程序运行前只用到了代码区和全局区。
代码区存放程序的机器指令。是只读的,防止修改。
全局区存放全局变量、静态变量与全局常量。

#include
using namespace std;
// 全局变量在全局区
int a = 1;
// 全局常量在全局区
const int b = 2;
// 全局静态变量在全局区
static int c = 3;
int main() {
  // 局部变量在栈区
	int d = 4;
	// 局部常量在栈区
	const int e = 5;
	// 局部静态变量在全局区
	static int f = 6;
	return 0;
}
2.2 程序运行中

在程序运行中,部分变量在栈区(stack)与堆区(heap)。
栈区存放的是局部变量,形参。由编译器自动分配。

// a和b都是形参,在栈区
int func(int a, int b) {
	// c是局部变量,在栈区
	int c = 3;
	return a + b + c;
}

堆区存放的是由malloc或new开辟出来的变量。需要由程序员自行开辟与释放。

int main() {
	// *head是局部变量,存在栈区,栈区内容是指向堆区的地址,堆区存放着对应的量
	TreeNode* head = new TreeNode();
	// 需要由程序员自行释放
	delete(head);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867394.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号