1.C++98关键字
面试:C++语言中一共有多少个关键字
在C++98中有63个关键字。(在回答的时候一定要带上语言标准带上)
2.命名空间
2.1 概念
实际就是一个新的作用域,用来解决命名冲突问题
2.2 定义方式
方式一:
namespace N1 (变量、函数、类)
方式二:
命名空间可以嵌套定义
方式三:
在同一个工程中,可以定义多个相同名称的命名空间——编译器最终会将相同名称的命名空间进行合并
2.3 成员使用方式
方式一:
命名空间名字 :: 成员名字
方式二:
using 命名空间名称 :: 成员名字
可以当成本文件的全局变量来使用
注意:可能会存在冲突,如果冲突就使用方式一进行使用
方式三:
using namespace 命名空间名称;
使用起来方便,但是容易产生冲突
3. IO输入&输出
兼容C语言——继续使用C语言的方式来输入输出
输入:cin——istream
输出:cout——ostream
优点:使用方便,不需要格式控制,因为在istream和ostream类中,已经将所有内置类型的输入和输出都重载过。
对于自定义类型,用户可以对operator<<和operator>>()进行重载
必须重载成友元函数
ostream& operator<<(ostream& _cout , const Date& d)
{
//使用_cout对d中的成员进行输出
return _cout;//支持连续输出
}
istream& operator>>(istream& _cin , const Date& d)
{
//使用_cin对d中的成员进行输入
return _cin;//支持连续输入
}
OJ题中循环输入:
while(cin>>a>>b){
//对接收到的数据进行处理
}
字符串:
while(getline(cin, s)){
//对接收到的数据进行处理
}
4.缺省参数
4.1 概念
在声明和定义函数时,可以给函数参数待上一些默认值,将来在进行函数调用时,如果用户没有传递实参,则使用默认值;
例子——备胎
4.2 分类
全缺省参数:
每个参数都有默认值。
半缺省参数:
部分参数有默认值(从右往左依次给出)
4.3 注意事项
不能在声明和定义的位置同时给出。
只能从右往左依次给出。
默认值可以是:常量或者全局变量。
C语言不支持。
5. 函数重载
5.1 概念
在相同作用域和中,定义一系列:函数名相同,但是参数列表不同的函数(参数类型、参数个数、类型次序。与返回值类型是否相同无关)
例子:一词多义。
5.2 调用原理
在编译时候,编译器会对传递的实参类型进行推演,根据推演的结果选择合适的类型的重载函数进行调用。如果存在类型完全匹配的函数,则直接调用。如果参数类型不是完全匹配,则编译器会尝试进行 隐式类型转换,如果转换之后有合适 的函数可供调用,则调用,否则编译失败。
5.3 底层实原理
C语言不支持,函数名字修饰规则:只是在函数名前加_
C++支持,函数名字修饰规则:将类型信息编译到名字中
5.4 extern “C”的作用
为什么要有?
C语言和C++的编译器对函数名字修饰规则不同,在C和C++混合编译的场景中,就需要保证最终名字一致。
大多数使用在库函数的实现上。
作用:让C++编译器按照C语言的方式对代码来进行编译
5.5 补充:常见的调用约定
6. 引用
6.1 概念
别名+举例说明
6.2 特性
在定义时候必须要初始化。
引用一旦和实体结合后,再不能引用其他的实体。
一个变量可以有多个引用。
6.3 const类型引用
6.4 引用应用场景
简化代码。
作为函数参数。
作为返回值(注意:不能返回函数栈上的空间)
6.5 传值、传地址、传引用效率比较高
6.6 指针和引用的区别
从底层实现上来说,没有任何区别,编译器会将代码编译完成之后,会将引用直接转换为指针。(引用底层就是按照指针的方式实现的)
//方法一
T& -----T* const
//方法二
const T&---->const T* const
引用变量实际是会开辟空间的,空间中是引用实体的地址。
概念+特性+使用方法区分:(8条)
7. 内联函数
7.1 概念
7.2 特性4个
inline是一种以空间换时间的做法,省去调用函数的额外开销。所以代码很长或者有循环/递归的函数不适合使用作为内联函数。
inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数内有循环/递归等,编译器优化时会忽略掉内联。
inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址,链接就会找不到。
7.3 内联函数和宏的区别
7.4 宏的优缺点
优点:
增强代码的复用性。
提高性能。
缺点:
不方便调试宏。(因为预编译阶段进行了替换)
导致代码可读性差,可维护性差,容易误用。
没有类型安全的检查。