2021-01-28 16:04:47
浏览数 (1)
extern那些事
- extern "C" 是放在.cpp文件中,而不是放在.c中,不然会有编译错误。放在.c的情况都是加上了#ifdef __cplusplus#endif即用来识别当前文件用C 进行编译,所以才不会报错。
static那些事
- 静态成员变量未赋值的存放在bss段,赋值过就放在data段.
- 类的静态数据成员如成员函数或者成员变量,不依赖于类对象本身,即类中的静态数据成员由对象共享。因此静态变量不能使用构造函数初始化;静态函数仅能访问静态数据或静态成员函数。
- 静态类对象和静态对象(变量)一样,生命周期是贯穿整个程序的生命周期。
const那些事
- 类中使用const, 只用常成员函数才能操作常量或者常函数;const对象只能访问const成员函数;
- const变量默认为非
extern
,所以要使得const 变量在其他文件中访问,必须在文件中显示地指定它为extern
;
this 那些事
- 在类的非静态成员函数中返回类对象本身使用
return *this
; - this指针本身是const指针,即class A的非const成员函数中this指针类型为
A *const
,const成员函数则为const A *const
.
inline
- inline顾名思义 expanded in line,即以代码膨胀(复制)为代价,省去了函数调用的开销,从而提高函数的执行效率;
- inline要与函数定义放在一起,即inline是用于实现的关键字,而不是用于声明的关键字
sizeof
- 空类的大小为1,因为Cpp要求每个实例在内存中有独一无二的地址,计算机中的最小内存为1字节;
- 对于包含虚函数的类,不管有多少个虚函数,也只有一个虚指针vptr的size,因为同一个类的不同实例共用同
一份虚函数表
volatile
volatile
是一种类型修饰符,使用volatile
声明的类型变量都会被意外的更改,编译器不应对这样的对象进行优化。volatile
声明的变量,每次访问都必须从内存中取出(没有被 volatile 修饰的变量,可能由于编译器的优化,从 CPU 寄存器中取值)- const 可以是 volatile (如只读的状态寄存器)
assert
- 断言处理主要检查逻辑上不可能的情况
- 忽略断言可以在
#include<assert.h>
前加上 #define NDEBUG
可重入函数与线程安全
- 可重入即表示可以重复进入,意味着这个函数可以被中断,因此函数内部应该除了使用自己栈上的变量外部依赖任何环境,如果必须要访问全局变量,则一定要注意实施互斥手段。
- 判断一个函数是不是可重入函数,在于判断其能否可以被打断,打断后恢复运行能够得到正确的结果。(打断执行的指令序列并不改变函数的数据)
判断一个函数是不是线程安全的,在于判断其能否在多个线程同时执行其指令序列的时候,保证每个线程都能够得到正确的结果。
作用域解析运算符
::
scope resolution operator 首先先这个符号在C中并不支持- 用于命名空间或类名后,用于静态成员,用于作用域枚举
enum
- 传统枚举可能出现的问题有3:a.作用域不受限,导致全局冲突; b.会隐式转换为
int
;c.枚举的实际类型不能明确指定(比如指定为字符'a'
,最后会隐式转为ASCII码97) - 现代处理方式:
a.使用struct(或class public)进行枚举封装,不用
namespace
是担心封闭性不高;(解决上述问题1.a)
b.c 11中enum class
(解决上述所有问题) - enum在C 类中妙用:类中的枚举常量,可以避免
#define MAXSIZE 100
这样全局的宏常量处理,可能问为啥不用const
,因为const
数据成员只能在某个对象的生命周期内是常量,不同的对象无法保证是一样的。
代码语言:c
复制/*2.b*/
enum class Color3:char; // 前向声明
// 定义
enum class Color3:char
{
RED='r',
BLUE
};
char c3 = static_cast<char>(Color3::RED);
/*3*/
class Person{
public:
typedef enum {
BOY = 0,
GIRL
}SexType;
};
//访问的时候通过,Person::BOY或者Person::GIRL来进行访问。