Day One
第一章 开始
-
控制流 ,for语句和while语句,for循环的执行顺序:
for(int val = 1;val <= 10; ++val) sum += val;
(1)创建变量val,将其初始化为1;
(2)检测val是否小于等于10,若检测成功,执行for循环体,失败则退出循环,继续执行for循环体后的第一条语句。 -
用while来读取数量不定的输入数据:
while(cin >> value)
将istream对象作为循环条件效果是检测流的状态;当遇到文件结束符(Ctrl+Z)或者遇到一个无效的输入(例如输入不是个整数),状态即为无效
-
对于不属于标准库的头文件,使用双引号( “ ” )包围
-
点运算符只能用于类类型的对象
第二章 变量和基本类型
-
1byte=8bit
-
无符号类型仅能表示大于等于0的值
-
执行浮点数运算选用double,float的精度通常不够
-
当我们给无符号类型一个超过它表示的范围的值时,结果是初始化值对无符号表示数值总数取模后的余数,例如:
-1%256=(-1+256)%256=255 -
整型字面值常量,0开头表示八进制数;0x或0X开头的表示十六进制数
-
字符串字面值的结尾处自动添加一个‘\0’,因此长度+1
-
转义序列都是以反斜杠作为开始 “ \ ”
-
初始化不是赋值,赋值是将对象的当前值擦除,赋予新值
-
用花括号来初始化变量称为列表初始化 list initialization
-
分离式编译,将声明和定义分开,声明使得名字为程序所知,而定义负责创建与名字相关联的实体,定义还申请存储空间,也可能会为变量赋值
-
extern关键字加在变量前,且无显式的初始化,则该语句为声明,若显式地初始化了,则为一个定义而不是声明:
extern int i
为一个声明;extern int i =1
为一个定义 -
变量的定义必须出现在一个文件中,其他用到该变量的文件必须对其进行声明,不能重复定义
-
允许在内存作用域中重新定义外层作用域已有的名字,若要使用外层作用域的变量,则需要使用作用域操作符(::)来覆盖默认的作用域规则
-
一般说的引用都是左值引用,引用必须被初始化
-
引用即别名,而非对象,引用只能绑定在对象上,而不是一个字面值或某个表达式的计算结果
-
指针同样实现对其他对象的简介访问,允许不初始化,但是不初始化会指向不确定的值
-
由于引用不是对象,没有实际地址,因此不能定义指向引用的指针
-
空指针不指向任何对象,得到空指针最直接的方法就是赋予字面值nullptr
-
void*指针可以存放任意对象的地址
-
理解复合类型的声明,离变量名最近的符号对变量的类型有最直接的影响,遵循从右向左的阅读方法
-
const限定符创建的对象一旦创建后其值就不能再改变,因此const对象必须初始化
-
const对象如果要在多个文件中使用它,需要在变量的定义前加上extern关键字
-
常量引用可以绑定到非常量上,但是非常量引用不能绑定到常量上
-
不能为非常量引用绑定字面值,而常量引用可以绑定到字面值上
-
整型引用被绑定到另外一种类型,,编译器会先产生一个临时量对象来进行类型转换,此时改变引用的值时仅仅改变的是临时量的值,因此这种行为为非法行为
-
指向常量的指针pointer to const可用于存放常量对象的地址或者普通变量的地址,普通指针不能指向常量的地址
-
int *const ptrErr = &err
从右向左阅读可知,指针指向的地址可以改变,但是指针不能改变 -
const int *const ptr = &p
从右向左阅读可知,指向指向的是一个常量的地址,指针也是一个const指针 -
用顶层const描述上述问题就是指针本身是个常量;用底层const表示指针所指的对象是一个常量
-
用于声明引用的都是底层const
const int &r = ci
-
靠右的const是顶层const,靠左的是底层const
const int *const p3 = p2
-
转换规则:当执行对象的拷贝操作时,拷入拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换,以及非常量可以转换成常量
-
声明为constexpr变量一定是一个常量,而且必须用常量表达式初始化
-
一个constexpr指针的初始值必须是nullptr或者0,或者存储于某个固定地址的对象
-
限定符constexpr声明一个指针的话,限定符则仅仅对指针有效,于指针所指的对象无关
constexpr int *q = nullptr//q是一个指向整数的常量指针
-
进行类型别名定义时,可以使用
typedef A B
或者using A = B
-
auto来进行类型推算时会忽略掉顶层const,同时底层const会保留下来
-
decltype类型指定符从表达式推断出要定义的变量的类型,仅仅得到类型,而不计算表达式的值
-
如果decltype的表达式内容是解引用的操作,那么decltype将得到引用类型,即必须要初始化绑定对象
-
decltype的结果类型与表达式的形式密切相关,当给变量加上一层或多层括号,编译器就会把它当成是一个表达式,变量是一种可以作为赋值语句左值的特殊表达式,所以这样的结果类型永远就是引用
decltype((i)) d;//错误:d是int&类型,必须初始化
-
确保头文件多次包含仍能安全工作的常用技术是预处理器和头文件保护符
#ifndef SALES_DATA_H #define SALES_DATA_H #include <string> struct Sales_data { }; #endif