C++ 知识点
内联函数inline
- inline 和 宏定义#define的作用基本类似,都是替换或者展开。 在程序编译阶段,如果遇到内联函数,则将内联函数的实现在当前位置展开。内联的目的是为了减少函数的调用开销,从而提高运行效率,但会增加代码体量。
内联函数的优缺点
优点:
(1)通过避免函数的回调,加速了程序的执行;
(2) 通过利用指令缓存,增强局部访问性;
(3)使用内联可以替换重复的短代码,方便代码管理;
缺点:
(1) 由于是替换展开,因此会增大代码体量;
(2)一旦修改内联,所有用到该内联的地方都需要重新编译;
内联函数与宏的区别
(1)内联函数可调试,而宏定义不行;
(2)内联函数首先是函数,函数的很多性质都适用于内联函数,如:内联函数可以重载;编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
(3)内联函数可以访问类的私有成员变量,宏定义则不能;
static的用法详解
1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。
int foo() {
static int i = 1; //在调用的第一次进行初始化,之后调用不再初始化
return i;
}
//跟定义一个全局变量有什么区别呢,同样是初始化一次,连续调用foo()的结果是一样的,
//但是,使用全局变量的话,变量就不属于函数本身了,不再仅受函数的控制,
//给程序的维护带来不便。静态局部变量正好可以解决这个问题。
//静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,
//直到下次赋新值。
2.静态全局变量:定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。
3.静态函数:准确的说,静态函数跟静态全局变量的作用类似:(不能被其它文件所用;其它文件中可以定义相同名字的函数,不会发生冲突;)
4.静态数据成员:用于修饰 class 的数据成员,即所谓“静态成员”。这种数 据成员的生存期大于 class 的对象(实体 instance)。静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
5.静态成员函数:用于修饰 class 的成员函数。
(1)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用
(2) 静态成员函数不能访问非静态数据和调用非静态函数,非静态成员函数可以访问静态数据。
Volatile
volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据
C++ 中 struct 和 class
struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。
最本质的一个区别就是默认的访问控制
默认的继承访问权限。struct 是 public 的,class 是 private 的。
左值与右值
最早是从C语言继承而来的。在C语言,或者继承版本的解释
- 左值是可以位于赋值运算符 = 左侧的表达式(当然,左值也可以位于 = 的右侧),而
- 右值是不可以位于赋值运算符 = 左侧的表达式。
根据《C++ Primer》的说法,左值和右值可以这样区分:
-
一个表达式是左值还是右值,取决于我们使用的是它的值还是它在内存中的位置(作为对象的身份)。也就是说一个表达式具体是左值还是右值,要根据实际在语句中的含义来确定。
(通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。所有的变量都满足这个定 义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效)
左值和右值的语法符号:左值的声明符号为”&”, 为了和左值区分,右值的声明符号为”&&”。
新特性的目的
右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:
消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
能够更简洁明确地定义泛型函数。
details: https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/index.html
虚函数
C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现: https://blog.twofei.com/496/
智能指针
- shared_ptr:多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。
- weak_ptr:允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何weak _ptr 都会自动成空
- unique_ptr: 是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。一旦拥有着被销毁或编程 empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放