- ++运算符
++运算符的对象必须是左值,而表达式的值都是右值。区分左值与右值的最简单方式就是:左值可以对其取地址赋值,右值不可以取地址。
比如(x+y)++里的(x+y)就是表达式,
++(a-b–)也是
注意后置++的优先级高于前置++
例题表达式
double d;
d=1,d+5,d++;此时d的值为2
-
不能声明为虚函数的函数
普通函数(非成员函数),静态成员函数,内联成员函数,构造函数,友元函数。 -
#ifdef
#define s345是空宏定义
一般空的宏定义的作用是
1.对函数进行标识、说明
2.可以解决编译器兼容的问题, -
32位与64位
差别
32位 | 64位 | |
---|---|---|
char* | 4字节 | 8字节 |
long | 4字节 | 8字节 |
最大的不同点就是在long型和指针类型长度不一样,对于指针而言,64位机器可以寻址2^64,每个内存地址长度为64位,即8字节。
-
#include “stdlib.h”会先搜索本地工作目录,没有找到对应头文件就搜索标准库,然而#include <stdlib.h>是直接搜索标准库。所以后者速度更快
-
多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。
-
函数指针与该指针所指的函数必须具有一致的noexcept异常说明,而非相同。编译器并不会在编译时检查noexcept声明。
-
文件指针
通俗的说,文件指针就是指向文件的指针变量,定义说明文件指针的一般形式为:FILE *指针变量标识符;其中FILE应为大写。文件指针指向的是一块内存区域,这块区域存储着打开的文件的相关信息,包括文件读取指针当前位置、文件读取缓冲区大小等信息,并不是指向文件的。 -
面向对象的基本原则
s( Single-Resposibility Principle ): 单一职责原则
一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因
o( Open-Closed principle ): 开放封闭原则。软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的
l( Liskov-Substituion Principle ): 里氏替换原则。子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础
i( Interface-Segregation Principle ): 接口隔离原则,使用多个小的专门的接口,而不要使用一个大的总接口
d( Dependecy-Inversion Principle ): 依赖倒置原则,依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 -
inline
使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。
关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用
inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。
定义在类声明之中的成员函数将自动地成为内联函数 -
const成员只能在构造函数的初始化列表中初始化
如果非要在类中声明处初始化,就要加上static才行,而且初始化的对象必须是整型 -
BitCount算法——MIT HAKMEM算法
int bitcount(unsigned int n)
{
unsigned int tmp;tmp = n
- ((n >> 1) & 033333333333)
- ((n >> 2) & 011111111111);tmp = (tmp + (tmp >> 3)) & 030707070707
return (tmp%63);
}
计算32位整型数中的’1’的个数
其他:
1.read函数能够从输入流中提取指定长度的字节序列
2.int左移32位相当于不变,左移50位相当于左移18位
3.32位系统最大的寻址范围2^32
4.优先级:算术运算符>移位>关系运算符>逻辑位运算符>逻辑运算符
5.文件可分为ASCII码文件(文本文件)和二进制文件两种
6.printf默认右对齐,printf输出的数据不仅受输出域宽和小数域宽限制,也受数据在内存中存储精度影响