- %(取余),~(取反),^(按位异或),&(按位与),|(按位或) 这几个运算符都要求运算对象必须是整型
- 预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。
- 源文件的每一行只能有一条预处理命令,如果指令一行放不下,可以通过反斜杠“/”进行控制。
- 宏名通常由大写字母表示,而非必须
- 宏是在预编译期间进行的,将代码中的指定字符转换,转换结束后,再进行编译,所以不占用程序运行时间
- 函数可以嵌套使用,但是不能嵌套定义
- auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。是在使用时才分配内存
- 对多线程int x操作:赋值为未知时,加锁:x=y需要进行同步。而++x,x++不是原子操作,需要进行同步
- 只要不是原子操作的,都需要加锁,进行同步
- 原子操作就是不可分割,不会被打断的操作
- 友元函数重载时,参数列表为1,说明是1元,为2说明是2元
成员函数重载时,参数列表为空,是一元,参数列表是1,为2元
说宏和函数的区别:
- 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
- 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
- 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
- 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
- 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.
内联函数与宏的区别:
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.在类中声明同时定义的成员函数,自动转化为内联函数。
- 数组地址
- &a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不相同
- &a表示一个指向大小为5数组的指针,那么(&a+1)就是表示一个指向大小为5的下一个数组的指针, 也就是数组a最后一个元素的下一个位置
- 数组可以也动态实现,int n; cin>>n,int *p=new int[n]; 指针传递也是传地址
- 对象之间通信实际上就是通过函数传递信息,封装是把数据和操作结合在一起,继承是对于类的方法的改变和补充,重载是多态性之一。
- 如: int const * const p;
找到第一个const, 后面除了有个const之外 就是 * 和 p, 那么见证奇迹的时刻来了,
const * p 这就是我们要的结果,p指向的内容不可变。找到第二个const, 后面只有个p, const p,,这就是结果, p不可变 - 规则总结如下:找到const, 再看后面除了const的内容,是什么东西,那个东西不能变即是
- 只需要记住可以声明成虚函数的就行!(普通的成员函数或析构函数)
- 虚函数的使用原则:可以把public或protected的部分成员函数声明为虚函数;
- C++中的析构函数通常是虚析构函数;
- 构造函数不能声明为虚函数;
- 虚函数不能声明为静态的、全局的、友元的。