</pre><p> <span style="BACKGROUND-COLOR: #33ccff">这两天没有太多的事情,c++primer是我大一下学期的时候买的,看过一段时间,之后又没再看,现在大二上学期,在学面向程序设计语言,这两天在回顾c++primer的时候,有的地方会比原先明白很多,有的地方还不是特别的明白,</span></p><p><span style="font-size:18px;BACKGROUND-COLOR: #33ccff">而我野会把我不会的,和我自己不熟悉的基础知识在这个博客中慢慢记录,可以见证我的成长吧。</span></p><p><span style="BACKGROUND-COLOR: #33ccff"></span> </p><p> <span style="font-size:18px;"> <span style="color:#3333ff;">2.1 基本内置类型</span></span></p><p><span style="font-size:18px;color:#3333ff;"> 2.1.2 类型的转换</span></p><p><span style="font-size:18px;color:#3333ff;"> signed char c = 256; <span style="color:#ff0000;"> //</span><span style="color:#009900;"> </span><span style="color:#ff0000;">c的值是未定义的</span></span></p><p> <span style="font-size:18px;"><span style="color:#ff0000;">当我们赋给带符号类型的一个超出它表示范围的值时,结果是未定义的。此时,程序可能继续工作,可能崩溃</span></span></p><p><span style="font-size:18px;color:#cc0000;">也可能产生垃圾数据</span></p><p> </p><p> <span style="font-size:18px;color:#3333ff;"> 含有无符号类型的表达式(unsigned)</span></p><p><span style="font-size:18px;color:#3333ff;">(1)无符号的运算</span></p><p><span style="font-size:18px;color:#3333ff;"> unsigned u = 10;</span></p><p><span style="font-size:18px;color:#3333ff;"> int i = -42;</span></p><p><span style="font-size:18px;color:#3333ff;"> cout << i + i << endl; // 输出 -84</span></p><p><span style="font-size:18px;color:#3333ff;"> cout << u + i << endl; // 输出 4294967264(int 占32位)</span></p><p><span style="font-size:18px;color:#3333ff;">(2)无符号的循环算法</span></p><p><span style="font-size:18px;color:#3333ff;"> for(unsigned u = 10; u>= 0; --u)</span></p><p> <span style="font-size:18px;color:#3366ff;"> cout << u << endl;</span></p><p> <span style="font-size:18px;color:#ff0000;"> 当u为-1时,对u进行取模,得到一个大数,再次循环</span></p><p><span style="color:#009900;"></span> </p><p> <span style="font-size:18px;color:#3366ff;"> 2.1.3 字面值常量</span></p><p><span style="font-size:18px;color:#3366ff;"> 整型和浮点型字面值</span></p><p><span style="font-size:18px;color:#3366ff;"> 20 // 十进制</span></p><p><span style="font-size:18px;color:#3366ff;"> <span style="color:#ff0000;">0</span>24 // 八进制</span></p><p><span style="font-size:18px;color:#3366ff;"> <span style="color:#ff0000;">0x</span>14 || <span style="color:#ff0000;">0X</span>14 // 十六进制</span></p><p><span style="font-size:18px;color:#3366ff;"></span> </p><p><span style="font-size:18px;color:#3366ff;"> 浮点字面值用小数点(3<span style="color:#ff0000;">.</span>1415)或科学计数法(3.1415<span style="color:#ff0000;">E</span>0或3.1415<span style="color:#ff0000;">e</span>0)表示</span></p><p><span style="font-size:18px;color:#3366ff;"></span> </p><p><span style="font-size:18px;color:#3366ff;">2.2 变量</span></p><p><span style="font-size:18px;color:#3366ff;"> 2.2.2 声明和定义 关键字(extern)</span></p><p><span style="font-size:18px;color:#3366ff;"></span> <span style="color:#3366ff;"> <span style="font-size:18px;">如果在多文件中使用同一个变量,必须将声明和定义分离</span></span></p><p><span style="font-size:18px;color:#3366ff;"> 变量的定义必须出现在且只能出现在一个文件中,其他用到该变量的文件必须对其进行声明,却绝不能重复定义</span></p><p><span style="font-size:18px;color:#3366ff;"></span> </p><p><span style="font-size:18px;color:#3366ff;">2.3 复合类型</span></p><p><span style="font-size:18px;color:#3366ff;"> 2.3.1 引用</span></p><p><span style="font-size:18px;color:#3366ff;"> int ival = 1024;</span></p><p><span style="font-size:18px;color:#3366ff;"> int &refval = ival; // refval 指向ival,是ival的另一个</span></p><p><span style="color:#3366ff;"><span style="font-size:18px;"> int &refval2; // <span style="color:#ff0000;">报错:引用必须被初始化</span></span></span></p><p><span style="font-size:18px;color:#ff0000;"> 引用和初始值绑定在一起,而不是将初始值拷贝给引用,因为无法令引用重新绑定到另一个对象,因此引用必须初始化</span></p><p><span style="font-size:18px;color:#ff0000;"></span> </p><p><span style="font-size:18px;color:#3366ff;">2.4 const 限定符</span></p><p> </p><p> <span style="font-size:18px;color:#ff0000;"> cont 对象一旦创建后其值就不能再改变,所以const对象必须初始化</span></p><p><span style="font-size:18px;color:#ff0000;"> const int i = get_size (); // 正确:运行时初始化</span></p><p><span style="font-size:18px;color:#ff0000;"> const int j = 42; // 正确:编译时初始化</span></p><p><span style="font-size:18px;color:#ff0000;"> const int k; // 错误:k是一个未经初始化的常量</span></p><p> <span style="font-size:18px;color:#3366ff;"> 如果想在多个文件共享用一个const对象,在变量定义前加上关键字extern</span></p><p> <span style="BACKGROUND-COLOR: #ffffff"> <span style="font-size:18px;"> <span style="color:#3366ff;"> 例如:// file_1.cc 定义并初始化一个变量,该常量能被其他文件访问</span></span></span></p><p><span style="font-size:18px;color:#3366ff;BACKGROUND-COLOR: #ffffff"> extern const int bufsize = fcn();</span></p><p><span style="font-size:18px;color:#3366ff;BACKGROUND-COLOR: #ffffff"> // file_1.h 头文件 </span></p><p><span style="font-size:18px;color:#3366ff;"> extern const int bufsize // 与file_1.cc中定义的bufsize是同一个</span></p><p><span style="font-size:18px;color:#3366ff;"></span> </p><p><span style="font-size:18px;color:#3366ff;">2.4.1</span></p><p><span style="font-size:18px;color:#3366ff;"> 初始化和对const的引用</span></p><p><span style="font-size:18px;color:#3366ff;"> (1)允许为一个常量引用绑定非常量的对象,字面值,甚至是一个一般表达式:</span></p><p><span style="font-size:18px;color:#3366ff;"> int i = 42;</span></p><p><span style="font-size:18px;color:#3366ff;"> const int &r1 = i; // 非常量对象</span></p><p><span style="font-size:18px;color:#3366ff;"> const int &r2 = 42; // 字面值</span></p><p><span style="font-size:18px;color:#3366ff;"> const int &r3 = r1 * 2; // 一般表达式</span></p><p><span style="font-size:18px;color:#3366ff;"> int &r4 = r1 * 2; <span style="color:#ff0000;"> // 错误,r4是一个普通的非常量引用</span></span></p><p><span style="font-size:18px;color:#3366ff;">2.4.2</span></p><p><span style="font-size:18px;color:#3366ff;"> 指针和const</span></p><p><span style="font-size:18px;color:#3366ff;"> <span style="color:#ff0000;"> 指向常量的指针(const int *)和常量引用(const int &)指的是不能改变所指对象的值,而没有规定那个值</span></span></p><p><span style="font-size:18px;color:#ff0000;">不能通过其它路径改变(可以是常量(const int),非常量(int))</span></p><p><span style="font-size:18px;color:#3366ff;"> </span></p><p><span style="font-size:18px;color:#3366ff;"> const 指针(int * const)----- 常量指针</span></p><p><span style="font-size:18px;color:#3366ff;"> 指针是对象而引用不是,因此可以把指针本身定义为常量。<span style="color:#ff0000;">常量指针必须初始化,而一旦完成初始化,它的值就不能发生改变。</span></span></p><p><span style="font-size:18px;color:#ff0000;"> int errNumb = 0;</span></p><p><span style="font-size:18px;color:#ff0000;"> int * const curErr = &errNumb // curErr 将一直指向errNumb</span></p><p><span style="font-size:18px;color:#3366ff;">2.4.4</span></p><p><span style="font-size:18px;color:#3366ff;"> (常量表达式)是<u><span style="color:#ff0000;">指值不会改变</span></u>,并且在<u><span style="color:#ff0000;">编译过程就能得到计算结果</span></u>的表达式:</span></p><p><span style="font-size:18px;color:#3366ff;"> </span></p><pre class="cpp" name="code"> const int max_files = 20; // 常量表达式
const int limit = max_files + 1; // 常量表达式
int staff_size = 27; // staff_size的值会改变
const int sz = get_size(); // 运行时才会得到结果
constexpr 变量:
将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式,声明constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = 20; // 20是常量表达式
constexpr int limit = mf + 1; // mf+1是常量表达式
constexpr int sz = size() // 只有当size是一个constexpr函数时,才是一条正确的声明语句