trick
存储类别、链接
序号
存储类别
作用域
链接
声明方式
1
auto 自动
块
无
块内默认
2
register 寄存器
块
无
变量前用关键字register
3
静态无链接
块
无
块内的static
4
静态内部链接
文件
内部
全局static
5
静态外部链接
文件
外部
全局变量,不加static
位操作
符号
~:取反 & | ^ 与 或 异或掩码
MASK=0x02 flags = flags & MASK 使用 MASK 中的 0 掩藏 flags 中的相应位打开位
MASK=0x02 flags = flags | MASK 使用 MASK 中的 1 打开 flags 中的相应位关闭位
MASK=0x02 flags = flags & ~MASK 使用 MASK 中的 1取反后 关闭 flags 中的相应位切换位
MASK=0x02 flags = flags ^ MASK flags中对应 MASK 中的 为1的位置的数全部改变,1变为0,0变为1检查位
MASK=0x02 (flags & MASK)==MASK 检查 flags 中的某位或某几位是否为1<< 左移 右移>>
位字段
主要是在结构体中声明位大小 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
构造
派生类先调用基类构造函数,再调用自己的构造函数
若基类构造函数需要参数,在构造函数的初始化列表处传过去
最后更新于
这有帮助吗?