目录
一、内联函数
1.1内联函数的概念
以inline修饰的函数叫做内联函数,在编译时C++编译器会在调用内联函数的地方展开(在该内联函数符合一定要求下才会展开,下面会提到),内联函数省去了函数压栈的开销,提高了程序的效率。
1.2内联函数的使用场景
- 比较短小的函数(1~10行)
- 频繁的调用
例如:堆排与快排,排序10w个数据,使用的swap(交换两个数据的值)函数。
1.3宏与内联函数
我们知道在C语言中也有和内联函数相似功能的宏,那么为什么C语言已经有了解决方案,C++还要加一个内联函数呢,这是由于宏具有一些缺陷,C++为了填补这些缺陷便有了内联函数。
宏的缺点:
1.宏无法调试。
2.宏函数比较难写。
3.宏由于类型无关,也就不够严谨。
4.宏可能会带来运算符优先级的问题,导致程序出错。
内联函数有宏的优点但又解决了宏的缺陷。
1.4内联函数的特性
- 内联函数是一种空间换时间的做法,省去函数压栈的开销。因此代码很长或者有循环/递归的函数不适宜作为内联函数。
- inline对于编译器只是一个建议,编译器会自动优化,如果定义的内联函数里面有循环/递归或内部代码较长,编译器优化时会忽略内联。
- inline声明和定义不建议分离,因为分离会导致链接错误。由于声明时该函数为内联函数,所以该函数不会记录在符号表中,也就没有函数的地址,当链接时编译器去符号表中寻找该函数就会找不到,提示链接错误。
二、auto关键字
2.1auto
在C++11中auto是一个新的类型指示符来指示编译器,auto声明的变量类型必须由编译器在编译期间推导而得。
2.2auto不能推导的场景
- auto不能作为函数的参数
- auto不能直接用来声明数组。
三、基于范围的for循环
3.1范围for的使用条件
1.范围for的迭代范围必须要是确定的
对于数组而言,就是数组第一个元素与最后一个元素的范围;对于类而言,就是提高begin和end方法。
下面是范围for的代码实现
四、指针空值nullptr
在C语言中空指针NULL被定义为整型0,但是这与我们认为的指针NULL有一点相悖,明明是指针,类型却是int,所以在C++中推出了新的空指针nullptr,原空指针NULL在C++中还是可以使用的。
五、类与对象
5.1面向过程与面向对象
C语言是面向过程的,关注的是过程,注重与如何将问题使用函数一步步解决。
C++是基于面向对象的,关注的是对象,将事情拆分为不同对象,依靠不同对象之间的交互来完成。
5.2类的引入
在C语言中,结构体只能定义成员变量,在C++中,结构体被升级为类,允许在结构体内定义函数。
5.3类的定义
class classname
{
//类体:由成员函数和成员变量组成
};//后面有分号
class为定义类的关键字,classname为类名,{}中为类的主体,注意定义结束时有分号。类中元素为类的成员:类中的数据被称为类的属性或者成员变量,类中的函数被称为类的方法或者成员函数。
类的两种定义方式
- 声明和定义都放在类体中,(注意如果成员函数在类中定义,编译器可能会将其当为内联函数处理)。所以小函数,想成为内联函数的,直接在类里面定义,如果是大函数,声明定义分离。
- 声明放在.h文件,类的定义放在.cpp文件中。
5.4类的访问限定符及封装
访问限定符有三个a.public(公有)b.protected(保护)c.private(私有)
- public修饰的成员可以在类外被访问。
- protected和private修饰的成员在类外不能被直接访问(protected与private是相似的)。
- 访问权限作用域从该访问限定符出现的位置直到另一个访问限定符出现为止。
- class的默认访问权限是private,struct的默认访问权限是public。
封装:将数据和方法进行结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
5.5类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。类体外定义成员需要使用::作用域解析符指明成员所在的域。
class Student
{
public:
void PrintStudenInfo();
private:
char _name[20];
char -id[20];
char sex[10];
};
//指定PrintStudenInfo函数所在的域。
void Studen::PrintStudenInfo()
{
//....
}