为某大学研究生复试做准备,参考书目为郑丽C++,C++ primer plus (主要参考)
特别鸣谢Alfred_Yong学长提供的C++基础知识概念学长的C++笔记
持续更新
C++面向对象概念参考:面向对象
C++11等深入概念参考:C++11等
目录
基础语法
1.说一下C++和C的区别
C++是面向对象的语言,而C是面向过程的结构化编程语言
C++具有封装、继承和多态三种特性
C++相比C,增加多许多类型安全的功能,比如强制类型转换、
C++支持范式编程,比如模板类、函数模板等
2.c++中的引用和指针
指针是一个变量,有自己的一块空间,而引用只是一个别名;
使用sizeof看一个指针的大小是4(大小同INT变量),而引用则是被引用对象的大小;
指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用;
指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;
指针可以有多级指针(**p),而引用至于一级;
指针和引用使用++运算符的意义不一样;
3.C++命名规则
只能使用字母字符,数字和下划线
第一个不能为数字,不能使用关键字
区分大小写
4.static关键字的作用
1. 全局静态变量
在全局变量前加上关键字static,存储于静态存储区,自动初始化为0,作用域为文件
2.局部静态变量
在局部变量之前加上关键字static,存储于静态存储区,自动初始化为0,作用域为函数/语句块,但是当作用域结束后变量不会被销毁,再次调用值不变
3.静态函数
在函数返回类型前加static,静态函数只是在声明他的文件当中可见,不能被其他文件所用
4.类静态成员&静态函数
静态成员可以实现多个对象之间的数据共享,类的对象共同维护一份静态数据,静态函数用于调用静态数据,它们是属于类的,而不是某个对象,所有对象共享一个静态成员。静态成员通过<类名>::<静态成员>来使用。
5.c++中四种cast转换
1.const_cast
用于将const变量转为非const
2.static_cast
用于各种隐式转换,类似C中的强制类型转换
3.dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。(向上子类转为父类是安全的,父类转子类不安全(考虑一下子类非继承的数据成员初始化问题))
4.reinterpret_cast
可进行不同数据类型的转换,比如指针转INT
6.++i和i++的区别
++i先自增1,再返回,i++先返回i,再自增1,i++返回临时变量,++i返回本身
//++i
int& int::operator++()
{
*this +=1;
return *this;
}
//i++
const int int::operator(int)
{
int oldValue = *this;
++(*this);
return oldValue;
}
7.new/delete与malloc/free的区别
new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数
int *a=new int;delete a;
int *p=new int[10];delete []p;
8.C语言参数压栈顺序
从右到左
函数调用机制(CSAPP)
参数准备-call指令-栈上存储-leave/pop
从右至左参数入栈,指针或引用则保存地址,调用call,函数返回地址入栈,然后jmp到函数位置执行,旧的ebp入栈方便函数执行结束后退回原位置;设置新栈底 mov %esp, %ebp
为函数分配栈空间,向下生长,执行结束后返回值赋值给eax,调用leave还原栈顶栈底
9.内联函数
使用关键字 inline ,在编译时将函数体嵌入在每一个调用,执行时不进行控制的跳转
• 内联函数体内不能有循环语句和 switch 语句;
• 内联函数的定义必须出现在内联函数第一次被调用之前;
10.作用域类型
作用域是一个标识符在程序正文中有效的区域, C++的作用域分为:函数原型作用域、函数作用域、文件作用域(全局作用域)、块作用 域(局部作用域)、类作用域和名字空间作用域。
11.数据内存
自动存储:在函数定义中声明的变量,它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。
静态存储:static在程序整个运行过程中都存在。
动态存储:堆,用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止
线程存储c++11:用于并行处理的不同线程,使用关键字thread_local声明的,则其生命周期与所属的线程一样长
12.C++程序处理
预处理-编译-汇编-链接
预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件
13.class 和 struct 结构体
默认成员访问权限不同,struct 默认是 public,而 class 默认是 private。
默认继承方式不同,struct 默认是 public,而 class 默认是 private。
在定义模板参数时可以用 class 但不能用 struct。
14.浅拷贝和深拷贝的区别
在拷贝的原始数据结构中存在指针时,浅拷贝拷贝指针本身,指向同一个地址,深拷贝则另开辟内存,完成指针的拷贝
15.const
定义 const 常量,具有不可变性,保护被修饰的东西。防止意外修改,const 定义的常量在程序运行过程中只有一份拷贝
const char * const * const p解释:
const char p 限定p为只读
const char* p: p为指向char的指针,const限定p指向的对象只读,即不能通过P改变char值
char* const p:限定P指向的对象不能改变
const char* const p:双限定
const char** p:p为指向指针的指针,const限定最终指向的对象只读
const char * const *p:限定最终对象和p指向的指针可读,即*p=?错误
const加在*前面限定指针,在后面限定对象
16.内存管理
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
堆:就是那些由 new
分配的内存块,一般一个new
就要对应一个 delete
。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区:就是那些由malloc
等分配的内存块,他和堆是十分相似的,不过它是用free
来结束自己的生命的。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
内存对齐 :变量的起始地址能够被其对齐值整除,结构体变量的对齐值为最宽的成员大小。 一般默认对齐值为4
17.野指针
使用free
或delete
释放了内存后,没有将指针设置为NULL
18.
include头文件的顺序以及双引号””和尖括号<>
编译器预处理阶段查找头文件的路径不一样。“”首先在当前头文件目录找,再去系统头文件找
对于使用尖括号包含的头文件,查找头文件的路径顺序为:编译器设置的头文件路径-系统头文件
19.内存泄漏
内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。导致内存浪费,搞忘free或者delete造成堆内存泄漏
20.共用体&枚举
union 共用体名{
成员列表
};
共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体所占内存大小为共用体内数据类型最大的那个。只能存储int long double
enum 枚举名 {枚举元素1,枚举元素2,……};
枚举成员为常量,整型,可提升为INT,枚举只定义了赋值运算,可进行显示设置枚举量的值
21.流对象
cout标准输出,cerr标准错误输出,没有缓冲,发送给它的内容立即被输出,clog类似于cerr,但是有缓冲,缓冲区满时被输出;cin输入流
输入输出的标准库:fstream、iomanip、ios、iosfwd、iostream、ostream、istream、sstream、streambuf
22.三种字符数组初始化的方法
char str[5] = {“hello”};
char str[6] = {‘a’,‘b’,‘c’,‘d’,‘e’,’\0’};
char str[] = “abcde”;
23.STL 是什么?组成部分和区别。
STL 是 c++提供的标准模板库。
STL 的主要组成部分为:容器、迭代器、算法、函数对象和适配器。