C++ 概念笔记(一)-适用于考研复试

为某大学研究生复试做准备,参考书目为郑丽C++,C++ primer plus (主要参考)

特别鸣谢Alfred_Yong学长提供的C++基础知识概念学长的C++笔记

持续更新

C++面向对象概念参考:面向对象

C++11等深入概念参考:C++11等

目录

基础语法

1.说一下C++和C的区别

2.c++中的引用和指针

3.C++命名规则

4.static关键字的作用

5.c++中四种cast转换

6.++i和i++的区别

7.new/delete与malloc/free的区别

8.C语言参数压栈顺序

9.内联函数

10.作用域类型

11.数据内存

12.C++程序处理

13.class 和 struct 结构体

14.浅拷贝和深拷贝的区别

15.const 

16.内存管理

17.野指针

18.include头文件的顺序以及双引号””和尖括号<>

19.内存泄漏

20.共用体&枚举

21.流对象

22.三种字符数组初始化的方法

23.STL 是什么?组成部分和区别。


基础语法

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.野指针

使用freedelete释放了内存后,没有将指针设置为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 的主要组成部分为:容器、迭代器、算法、函数对象和适配器。

 

 

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值