C++总结(1)

C++第一次总结,结合常见问题

const作用

修饰变量,修饰指针,修饰引用,修饰成员函数

const与#define的区别

const带类型,define不带类型

const在编译和运行时起作用,define在预处理阶段起作用

define没有类型检查,const有类型检查

define占代码段空间,const占数据段空间

static作用

修饰全局变量,修饰局部变量,修饰普通函数,修饰成员函数

介绍一下this指针

指向对象本身的指针

介绍一下inline内联函数

相当于把函数体写在调用函数处,类中函数(除虚函数)隐式为内联函数,有类型检查,提高了效率,但导致了代码膨胀

虚函数可以内联吗

可以内联,但表现多态时不行

volatile关键字作用

使修饰的变量不会被优化

assert()作用

如果它的条件返回错误,终止程序执行

sizeof()作用

获得变量或数组的大小,sizeof(指针)为指针大小

pragma pack(n)作用

以n字节方式内存对齐

extern作用

引用另一个文件中的变量或函数

struct和typedef struct区别

struct是定义结构体类型

typedef struct是为结构体类型设置别名

什么是函数指针

指向函数的指针,和指针变量一样,通过指针访问调用函数

struct 和 class区别

默认访问控制不同

struct是public,class是private

union特点

默认访问控制public

可以有构造函数、析构函数

不能有引用

不能继承派生

不能有虚函数

同一时间只有一个变量有值

struct和union的区别

union可以有构造函数和析构函数,struct没有

union不能有引用,struct可以

union不能有虚函数,struct可以

union同一时间只有一个变量有值

explicit关键字的作用

声明类构造函数是显示调用的

介绍一下友元

friend修饰,之后可以访问友元类的私有成语和函数

using的作用

引入命名空间

::运算符的作用

范围解析(全局、类、命名空间)

介绍一下enum类型

枚举类型

介绍一下引用

左值引用,右值引用(右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值)

指针和引用的区别

指针是一个变量,引用是一个别名

引用的大小是被引用对象的大小,指针大小是指针变量本身的大小

引用必须初始化,指针不用

引用不可修改,指针能修改

引用底层是指针实现的

介绍一下宏

#define,一对一的替换

介绍一下虚函数

用virtual关键字修饰,可以实现,也可以不实现(纯虚函数),存在纯虚函数的类叫抽象类,全部为纯虚函数的类叫接口类,用来实现多态,可以在子类中重新定义

什么是是虚析构函数

虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象

什么是纯虚函数

纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做

虚函数与纯虚函数的区别

虚函数有具体实现,纯虚函数只是声明

介绍一下虚函数指针

在含有虚函数类的对象中,指向虚函数表,在运行时确定

介绍一下虚函数表

在程序只读数据段,存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖原基类的那个虚函数指针

介绍一下C++的内存分配和管理

malloc:申请指定字节数的内存。申请到的内存中的初始值不确定

calloc:为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存的每一位(bit)都初始化为 0

realloc:更改以前分配的内存长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定

alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。C99 中支持变长数组 (VLA),可以用来替代 alloca

malloc和free的底层实现

先搜索堆中的空闲链表,如果有合适大小,直接分配,否则就向系统重新申请一段内存,用完后标记为空闲状态

C++数组越界会发生什么

数组越界会发生覆盖原有的数据,如果比较重要,可能会崩溃,如果不重要,肯就没有明显影响

介绍一下智能指针

用来实现内存的自动回收

智能指针是如何实现的

RAII技术(资源获取即初始化)

介绍一下shared_ptr

shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同内存,每使用一次,计数加一,析构一次计数减一,减为零时删除指向的堆内存

要注意不能用原始指针初始化多个shared_ptr

避免循环引用

介绍一下weak_ptr

为了配合shared_ptr引入的,不具有普通指针行为,可以观测资源使用情况,use_count()观测引用计数,lock()获得shared_ptr对象

什么是循环引用

两个shared_ptr相互引用

如何解决循环引用

将一个改为weak_ptr

auto的用法

auto x = …;

delete this合法吗

合法

delete this应用场景

this对象必须是通过new(不是new[])分配出来的;必须保证调用delete this的函数是最后一个调用this的函数,delete this 之后不能在使用this;不能delete this多次

new和delete底层实现

new 是调用operator new函数申请空间(malloc),在申请空间上执行构造函数构造对象

delete是在空间上执行析构函数清理对象资源,调用operator delete函数释放空间

malloc/free和new/delete的区别

malloc/free是C的库函数,new/delete是C++的运算符,new/delete底层用malloc和free实现,malloc不能自动的调用构造函数和析构函数

介绍一下模板

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

通过模板就可以实现定义不同类型的结构和函数

介绍一下常见的STL及用法

参考 huihut STL总结

传送链接

STL迭代器什么时候会失效

进行插入删除操作时,影响到的迭代器会失效

  • © 2020 QSH
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信