trick

存储类别、链接

序号

存储类别

作用域

链接

声明方式

1

auto 自动

块内默认

2

register 寄存器

变量前用关键字register

3

静态无链接

块内的static

4

静态内部链接

文件

内部

全局static

5

静态外部链接

文件

外部

全局变量,不加static

位操作

  1. 符号

    ~:取反
    & | ^ 与 或 异或
  2. 掩码

    MASK=0x02
    flags = flags & MASK
    使用 MASK 中的 0 掩藏 flags 中的相应位
  3. 打开位

    MASK=0x02
    flags = flags | MASK
    使用 MASK 中的 1 打开 flags 中的相应位
  4. 关闭位

    MASK=0x02
    flags = flags & ~MASK
    使用 MASK 中的 1取反后 关闭 flags 中的相应位
  5. 切换位

    MASK=0x02
    flags = flags ^ MASK
    flags中对应 MASK 中的 为1的位置的数全部改变,1变为0,0变为1
  6. 检查位

    MASK=0x02
    (flags & MASK)==MASK
    检查 flags 中的某位或某几位是否为1
  7. << 左移 右移>>

  8. 位字段

    主要是在结构体中声明位大小
    struct {
     int a:1;
     int b:1;
    }
    本来应该占8字节,现在只占4字节,因为对齐原则,一个int至少4字节,但只使用了2位,其他的30位为0,不使用

预处理器

#include,#ifdef,#ifndef

  • 常见就不用强调了

#if,#elif,#else,#endif

  • 和if else 差不多,也是后面跟判断条件

#define

#undef

  • 取消宏

#line和#error

#pragma

  • 编译器设置,例如可以改变struct的对齐字节数

  • pragma once是非标准,编译器自己实现,针对文件,若是有重复文件,还是会有重复包含问题

逗号

  • 在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

  • 假设b=2,c=7,d=5,

    • 对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a1=8。

    • 对于第二行代码,那么也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。

  • 注意:逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。

    • 例子:int a[2],x=2,y=5;

      a[0]=(x+3,y++,x++);那么最终结果是:a[0]=2 x=3 y=6;

      为何a[0]=2:因为(x++)是运算之后再自加

      a[1]=(x++,x+3,x+7);那么最终结果是:a[1]=11 ,x=4

      逗号运算是从左至右,所以先算x++,x从而变成4了,然后a[1]=4+7=11;

拷贝构造/赋值构造

深拷贝

  • 若有成员变量在堆区,要自己写拷贝构造函数进行深拷贝,否则只是浅拷贝

  • 赋值构造是重写=操作符,和拷贝构造类似,不过应该返回引用类型

调用拷贝构造的三种情况

  • 使用

  • 对象参数

  • 返回对象

继承访问权限

基类访问特性

继承方法

子类访问特性

public

public

public

protect

-

protect

private

-

no acess

public

protect

protect

protect

-

protect

private

-

no acess

public

private

no acess

protect

-

no acess

private

-

no acess

构造

  • 派生类先调用基类构造函数,再调用自己的构造函数

  • 若基类构造函数需要参数,在构造函数的初始化列表处传过去

最后更新于

这有帮助吗?