常见问题:
- 关键字:
- static:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.
- 隐藏:修饰全局函数、全局变量。当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
- 保持变量内容的持久:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见。如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
- static变量默认初始化为0:全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’;不妨做个小实验验证一下。
- 修饰类成员:初始化时使用作用域运算符来标明它所属类,静态数据成员是类的成员,而不是对象的成员。
- 类的静态成员函数是属于整个类而非类的对象,没有this指针,只能访问类的静态数据和静态成员函数。
- 不能将静态成员函数定义为虚函数。
-
由于静态成员声明于类中,操作于其外,所以对其取地址操作,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
-
由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X Window系统结合,同时也成功的应用于线程函数身上。
-
static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。
-
静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
- 静态成员初始化在类体外进行,与一般数据成员初始化不同:,
- 为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。
- const
- 修饰变量:阻止变量被更改,const int a=10;<=>int const a=10;
- 修饰指针:const位于*左侧,修饰所指对象,为底层const(可以表示任意对象是常量);const位于*右侧,修饰指针,为顶层const
- 修饰引用:不能通过该引用修改变量
- 修饰函数参数:传递过去的参数在函数内不能修改
- 修饰函数返回值:用const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同。
- 修饰类成员变量:只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。
- 修饰类成员函数:函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数
- extern
- volatile
- new与malloc
- #define与inline
- static:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.
- 四种类型转换
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
- 多态性与虚函数表
- 多态的实现
- 虚函数的作用
- 动态绑定
- 虚函数实现机制
- 菱形继承
- 继承与组合
- C++11的新特性
- auto、lambda、decltype、constexpr
- 智能指针
- share_ptr
- unique_ptr
- weeak_ptr
- 正则表达式