文章目录
- include双引号与尖括号的区别
- include头文件只包含一次
- 常量指针和指针常量
- C++11新特性,你用到了哪些
- C++中的智能指针如何工作
- 内存泄漏
- 运行时多态
- 虚函数是什么,工作机制是什么?
- strlen/sizeof/length/size的区别
- 哈希表底层,哈希冲突如何解决
- 右值引用与移动构造
- 深拷贝与浅拷贝
- 堆与栈的区别
- this指针
- inline内联函数
- 红黑树性质
include双引号与尖括号的区别
#include <stdio.h>
代表文件是一个工程或标准头文件。过程会检查预定义目录,我们可以根据设置路径来修改搜索目录。#include "xxx.h"
,用户提供的头文件。
include头文件只包含一次
防范守卫:
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H
// 头文件内容
#endif
预处理指令:
#pragma once
// 头文件内容
的使用更加简洁和方便,且具有更好的性能。它不需要定义宏,只需在头文件的开头添加这一行指令即可。
常量指针和指针常量
常量的指针:指向的值不可变
指针常量;指向的方向(指针地址)不可变
C++11新特性,你用到了哪些
花括号初始化列表vector<int> vec{1,2}
auto:在编译期间推导变量的类型,且不能定义数组
nullptr:代替NULL,专代表空指针
lambda表达式:
[capture list](parameter list) -> return type { function body }
[捕获列表] (参数列表) -> 返回类型 {函数体}
智能指针:
shared_ptr, unique_ptr独占性,weak_ptr
右值引用
C++中的智能指针如何工作
内存泄漏
1、堆内存泄露。通过智能指针的引用计数管理内存
2、没有将基类的析构函数定义为虚函数,这样子类的析构函数不会调用
3、在释放对象数组时没有使用delete[]。
4、缺少拷贝构造函数,系统会默认进行浅拷贝,他的缺陷是被赋值的对象原本的内存没有被释放。
运行时多态
虚函数是什么,工作机制是什么?
strlen/sizeof/length/size的区别
哈希表底层,哈希冲突如何解决
右值引用与移动构造
左值:可以取地址的,有名字的(函数返回的引用)
右值:不能取地址的,没有名字的(函数返回值)
左值引用:要求右边的值必须能取地址。如果不能只能用常引用,之后无法修改数据。
右值引用:int val = 10; int &&c = std::move(val);
通常用于移动构造函数
深拷贝与浅拷贝
浅拷贝
系统缺省提供,拷贝的时候简单的复制某个对象的指针。浅拷贝的问题如下:
1、两个对象的实例都指向一块内存,任何一个实例修改;
2、对象被析构时,可能会double free。
深拷贝
显式的提供拷贝构造函数,新旧实例不共享内存。
先用深拷贝的情况:
1、对象以值传递的方式传入;
2、对象以值传递的方式从函数体返回;
3、对象需要通过另外一个对象进行初始化。
堆与栈的区别
管理方式:栈由编译器自动申请,堆需要手动申请
空间大小:栈空间有限
内存碎片:栈不会产生碎片
分配方式:堆为动态分配;栈有静态分配(局部变量)和动态分配(编译器实现)。
分配效率:栈效率高。
静态全局变量、全局变量
1、都属于常量区
2、静态全局变量只在本cpp中有效,别的cpp想调用该变量调用不了。全局变量可以在别的文件中调用。
3、假设你在文件A.cpp中定义了一个全局变量int x;,然后在文件B.cpp中需要使用该变量,你可以在文件B.cpp中使用extern int x;声明该变量,这样编译器会知道该变量的定义在文件A.cpp中。文章来源:https://uudwc.com/A/dMWv0
this指针
inline内联函数
相当于直接把内联函数的内容半搬到调用内联函数处
相当于直接进入函数体
相当于宏,但是对了类型检查等等函数操作
在类声明中定义的函数,除了虚函数其他函数都会隐式的当作内联函数文章来源地址https://uudwc.com/A/dMWv0