记录C++遗忘项

2021-01-28 16:04:47 浏览数 (1)

extern那些事

  1. extern "C" 是放在.cpp文件中,而不是放在.c中,不然会有编译错误。放在.c的情况都是加上了#ifdef __cplusplus#endif即用来识别当前文件用C 进行编译,所以才不会报错。

static那些事

  1. 静态成员变量未赋值的存放在bss段,赋值过就放在data段.
  2. 类的静态数据成员如成员函数或者成员变量,不依赖于类对象本身,即类中的静态数据成员由对象共享。因此静态变量不能使用构造函数初始化;静态函数仅能访问静态数据或静态成员函数。
  3. 静态类对象和静态对象(变量)一样,生命周期是贯穿整个程序的生命周期。

const那些事

  1. 类中使用const, 只用常成员函数才能操作常量或者常函数;const对象只能访问const成员函数;
  2. const变量默认为非extern,所以要使得const 变量在其他文件中访问,必须在文件中显示地指定它为extern

this 那些事

  1. 在类的非静态成员函数中返回类对象本身使用return *this;
  2. this指针本身是const指针,即class A的非const成员函数中this指针类型为A *const,const成员函数则为const A *const.

inline

  1. inline顾名思义 expanded in line,即以代码膨胀(复制)为代价,省去了函数调用的开销,从而提高函数的执行效率;
  2. inline要与函数定义放在一起,即inline是用于实现的关键字,而不是用于声明的关键字

sizeof

  1. 空类的大小为1,因为Cpp要求每个实例在内存中有独一无二的地址,计算机中的最小内存为1字节;
  2. 对于包含虚函数的类,不管有多少个虚函数,也只有一个虚指针vptr的size,因为同一个类的不同实例共用同 一份虚函数表

volatile

  1. volatile是一种类型修饰符,使用volatile声明的类型变量都会被意外的更改,编译器不应对这样的对象进行优化。
  2. volatile声明的变量,每次访问都必须从内存中取出(没有被 volatile 修饰的变量,可能由于编译器的优化,从 CPU 寄存器中取值)
  3. const 可以是 volatile (如只读的状态寄存器)

assert

  1. 断言处理主要检查逻辑上不可能的情况
  2. 忽略断言可以在#include<assert.h>前加上 #define NDEBUG

可重入函数与线程安全

  1. 可重入即表示可以重复进入,意味着这个函数可以被中断,因此函数内部应该除了使用自己栈上的变量外部依赖任何环境,如果必须要访问全局变量,则一定要注意实施互斥手段。
  2. 判断一个函数是不是可重入函数,在于判断其能否可以被打断,打断后恢复运行能够得到正确的结果。(打断执行的指令序列并不改变函数的数据) 判断一个函数是不是线程安全的,在于判断其能否在多个线程同时执行其指令序列的时候,保证每个线程都能够得到正确的结果。

作用域解析运算符

  1. :: scope resolution operator 首先先这个符号在C中并不支持
  2. 用于命名空间或类名后,用于静态成员,用于作用域枚举

enum

  1. 传统枚举可能出现的问题有3:a.作用域不受限,导致全局冲突; b.会隐式转换为int;c.枚举的实际类型不能明确指定(比如指定为字符'a',最后会隐式转为ASCII码97)
  2. 现代处理方式: a.使用struct(或class public)进行枚举封装,不用namespace是担心封闭性不高;(解决上述问题1.a) b.c 11中enum class(解决上述所有问题)
  3. 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来进行访问。

0 人点赞