除去布尔型和扩展的字符型外,其他整形可以划分为带符号的和无符号的两种。带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。
如果表达式里既有带符号类型又有无符号类型,当这个带符号类型取值为负时会出现异常,因为带符号数会自动转换成无符号数。所以切勿混用带符号与无符号类型
unsigned u = 10, u2 = 42 ,u - u2 = 4294967264
10, 10u, 10L, 10uL, 012, 0xC整形字面值,无符号整形字面值,长整形字面值,无符号长整形字面值,八进制整形字面值,十六进制整形字面值;
int month = 09, day = 07; 八进制整形,八进制中没有9,所以会报错
1024f;非法,整形字面值不可加后缀f;
float最小尺寸为6位有效值,double最小尺寸为10位有效值。
前者代表单独的字符A,后者代表了一个字符的数组,包含两个字符:一个是字母A,另一个是空字符(‘\0’)
非布尔类型值赋给布尔类型值时,初始值为0,结果为false。除此之外为true
布尔类型值赋给非布尔类型值时,初始值为false,结果为0。初始值true,结果为1
初始化不是赋值,初始化的含义:创建变量时赋予其一个初始值
赋值:把对象的当前值擦除,用一个新的值来替代
定义于函数体内的内置类型的对象如果没有初始化,则其值未定义,如果试图拷贝或者访问此类值将引发错误。(所以建议初始化每一个内置类型的变量)
而类的对象如果没有显式地初始化,则其值由类决定。(例如string类如果没有指定初值则生成一个空串)
int i = { 3.14 }; 非法,不能执行强制转换,因为存在丢失信息的风险
int i = 3.14;合法,已强制转换。
声明规定了变量的类型和名字,定义不仅这样,还会申请存储空间,也有可能直接赋初始值。
extern int i; //声明i,但无定义(如果赋初始值就是定义了)
int j; // 声明并定义j
变量能被多次声明,但只能被定义一次
含义是在编译阶段检查类型
用户自定义的类名一般以大写字母开头 Sales_item
一旦定义了引用,就无法令其再绑定到另外的对象
引用是其他对象的别名。指针本身就是对象(所以它本身也有自己的地址),存放其他对象的地址
因为引用不是对象,没有实际地址,所以不能定义指向引用的指针
int *p1 = nullptr; int *p1 = NULL; 等价于int *p1 = 0
int *p1 = 0; 直接将p1初始化为字面常量0来生成空指针
推荐使用nullptr
pi = &ival;pi的值被改变,此时pi里是ival的地址,pi指向了ival
*pi = 0; ival的值被改变,指针pi并没有改变
任何非0指针对应的bool都是true;if(pi)
建议 int *p这种写法
int ival = 1024;
int *pi = &ival;
int **ppi = π
遇到复杂的指针和引用时,建议从右向左阅读
int i = 42;
int *p;
int *&r = p;// r是一个对指针p的引用
r = &i;// 因为r是引用了一个指针,所以给r赋值&i就是令p指向i
*r = 0; // 解引用r得到i,将i的值改为0;
为什么没有指向引用的指针?因为引用本身就不是一个对象。
const对象一旦创建后其值就不能再改变,所以const对象必须初始化
如果想在多个文件之间共享const对象,就必须在变量的定义之前加extern关键字
int errNumb = 0;
int *const curErr = &errNumb; // curErr将一直指向errNumb(此时可以通过指针修改errNumb的值)
const double pi = 3.14;
const double *const pip = π // pip是一个指向常量对象的常量指针(都不可修改)
const int *p;合法,指向常量的指针可以不初始化。
onst int *const p3;不合法,常量指针未初始化;
操作符(::)的意思是:编译器应从操作符左侧名字所示的作用域中寻找右侧那个名字
头文件里的内容会拷贝到所有引用它的文件中,所有应该避免在头文件中使用using声明
在用cin读取string对象时,会自动忽略开头的空白,并在下一个空白处停止
如果输入" Hello World “,那么输出将是"Hello”
要解决这个问题可以使用getline(cin, s),当遇见换行符时停止
string中的size()函数返回的其实是一个unsigned无符号的int值。所以,对于表达式s.size() < n来说,如果n是一个负值,则这个表达式的结果几乎100%是true,因为负值n会自动转换成一个比较大的无符号值。
所以如果一个表达式里已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题
C++中,字符串字面值与string是不同的类型,string s = “hello” + ","是错误的。必须保证每个加号两侧的运算对象至少有一个是string。
不管什么时候,只要对string对象使用了下标,都要确认这个下标处有值
小tips:
for (decltype(s.size()) index=0; index != s.size(); index++ ) {}
题目:
string s;
cout << s[0] << endl;
//合法,定义后就占用一个字节,包含’\0’。
vector中只能存放同一种类型对象
vector不能存放引用,因为引用不是对象
vector v1(10, 1); // 有10个元素,每个值都是1
vector v1{10, 1}; // 有2个元素,分别是10,1
vector svec(10, "null"); //正确,创建了一个包含10个元素为“null”的vector对象。
范围for语句体内不应改变其所遍历序列的大小
只能对已确认存在的元素执行下标操作(否则常常会出现缓冲区溢出buffer overflow)
下一篇:形容心结的诗句