C++PRIMER第一轮复习第二章

来源:互联网 发布:java的日志级别 编辑:程序博客网 时间:2024/04/28 06:43

2.1

算术类型:整型和浮点型。

整型,包括字符与布尔:bool, char, wchar_t, char16_t, char32_t, short, int, long, long long.

浮点型:float, double, long double. 通常,float以32bit表示,有7个有效位。double以64bit表示,有16个有效位。

char16_t 与char32-t 为Unicode字符集服务,c++11新定义了long long(64bit)。

可寻址的最小内存块成为字节,存储的基本单元成为字。大多数机器字节由8bit组成,字由32bit或64bit构成。

char、unsigned char、signed char。类型char到底是signed还是unsigned,与编译器有关。

几条经验:

  1. 当明知数值不可能为负时,用无符号类型。
  2. 使用int执行整数运算。实际应用中,short常常显得太小而long一般和int一样大。所以如果数值超过了int的表示范围,就用long long。
  3. 算术表达式中不要使用char或bool, 只有存放字符或布尔值时,才用他们。因为鲁棒性。
  4. 执行浮点数运算选用double,因为float常常精度不够,且双精度与单精度的计算代价相差无几。long double提供的精度一般没有必要。
程序应该避免无法预知和依赖于实现环境的行为。

字面值常量: Ox或OX开投代码十六进制数,O开题代表八进制数,如20, O24, Ox14. 默认情况下,十进制是带符号数,八进制与十六进制可能带符号也可能无符号。十进制字面值的类型是int, long, long long三种能容纳其的最小尺寸的,如20就是int型的。八进制与十六进制是int, unsigned int, long, unsigned long, long long, unsigned long long中能容纳其尺寸最小的。

字符字面值,字符串字面值。编译器在每个字符串的结尾处添加一个空字符‘\0’,所以字符串实际长度比它的内容多1. 如果两个字符串字面值位置紧临仅由空格、缩进、换行分隔,则他们是一个整体。

转义序列:\n换行 \t横向制表符 \a报警符 \v纵向制表符 \b退格符 \"双引号 \\反斜线 \?问号 \'单引号 \r回车符 \f进纸符 

\x后面紧跟1个或多个十六进制数字,或者\后面紧跟1、2、3个八进制数字。

指定字面值的类型。通过增加前缀和后缀。前缀: U Unicode 32字符 u Unicode 16字符 L 宽字符 u8 UTF-8(仅适用于字符串字面常量)。整型字面值后缀 u OR U unsigned, l OR L long, LL OR ll long long, 浮点字面值后缀: f OR F float, L OR l long double.

2.2

库类型 std::string. string 也是在命名空间std中定义的。

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象当前值擦除,而以一个新值来代替。

列表初始化: 

int a=0;int a={0};int a{0};int a(0);

//当使用内置类型的变量时,如果列表初始化且有丢失信息的风险时,编译器将报错:int double ld=3.141592653539;int a{ld},b={ld};//错误,因为存在丢失信息的风险int c(ld), d=ld;//正确,转换正确执行,且确实丢失部分值

默认初始化,定义于任意函数之外的变量默认初始化为0,定义在函数体内部的变量为被初始化,是未定义的。

变量声明使得名字为程序所知,一个文件想使用别处定义的名字则必须包含对那个名字的声明,而定义负责创建与名字关联的实体。声明规定了变量的类型与名字,除此之外,定义还申请存储空间,也可能为变量赋一个初始值。若要声明一个变量而不是定义它,则在变量名前添加关键字extern,且不要显示的初始化变量。变量只能被定义一次,但可以被声明多次。

extern double pi=3.1416;//抵消了extern的作用,变成了定义pi了。

若要在多个文件中使用同一个变量,就必须将声明与定义分离,此时,变量的定义必须且只能出现在一个文件中,而其他用到该变量的文件必须定义,却绝不能重复定义。

C++是一种静态类型,就是在编译阶段检查类型。其中检查类型的过程称为类型检查。

变量名规范:

标识符要能体现实际含义;

变量名一般用小写字母;

用户自定义的类名一般以大写字母开头;

若标识符由多个单词组成,则单词间应该有明显区分,如student_loan或者studentLoan。

名字的作用域:C++语言中绝大多数作用域都以花括号分隔,main位于所有花括号之外,它和大多数定义在函数体之外的名字一样有全局作用域。函数内定义的变量有块作用域。

建议:第一次使用变量的时候再定义变量。

嵌套的作用域,内层作用域、外层作用域。作用域中一旦声明了某个名字,则它所嵌套着的所有作用域中都能访问该名字,同时允许在内存作用域中重新定义外层作用域已有的名字。例子,::resused表示使用全局作用域的reused变量(全局作用域本身没有名字)。

2.3

复合类型是指基于其他类型定义的类型。引用和指针就是两种符合类型。

C++11新增了一种“右值引用”,严格来说,当我们使用术语“引用”时,指的其实就是“左值引用”。引用为对象起了另外一个名字。引用必须初始化(一旦初始化完成,引用将和它的初始化对象一直绑在一起,而不是将初始值拷贝给引用)。

空指针:nullptr  0 NULL(头文件cstdlib中定义,值为0);

不能把int变量直接赋给指针,即使int变量巧好为0也不行。

void *指针存放一个并不知道什么类型的地址。以void*视角看内存空间仅仅是内存空间,没办法访问内存空间中所存的对象。

2.4

为了防止程序不小心改变不能被改变的值,可用const对变量类型加以限定。const对象仅在文件内有效。const对象必须初始化。

const对象仅在文件内有效,如果想在多个文件间共享cosnt对象,必须在变量的定义之前添加extern,指明此对象非本文件独有,可以在其他文件被使用。

常量引用是对const的引用。允许常量引用绑定非常量的对象、字面值,甚至是一般表达式。

常量指针是指指针本身是个常量。

顶层const表示指针本身是个常量,底层const表示指针所指对象是个常量。

常量表达式是指值不会改变且在编译过程就能得到计算结果的表达式。C++11新标准规定,允许将变量声明为constexpr类型,以便由编译器验证变量是否是一个常量表达式。声明为constexpr的变量一定是个常量,且必须由常量表达式初始化。可以用constexpr函数去初始化cosntexpr变量。

2.5

类型别名是个名字,是某种类型的同义词。有两种方法可用于定义类型别名。传统的方法是typedef

typedef double wages;//wages是double的同义词typedef wages base,*p;//base是double的同义词,p是double* 的同义词 

新标准规定的方法是使用别名声明定义类型的别名:

using SI=Sales_items;//SI是Sales_items的同义词

如果某个类型别名纸袋的是符合类型或常量,那么用到声明语句里可能有想不到的结果,如:

typedef char *pstring;const pstring cstr=0;//cstr是指向char的常量指针const pstring *ps;//ps是一个指针,它的对象是指向char的常量指针。const char *cstr=0;//是对cstr错误的理解

C++11引入auto类型说明符,让编译器去分析表达式所属的 类型,auto定义的变量必须有初始值。

auto item=val1+val2;

可以用auto在一条语句中定义多个变量,但是由于一条语句只能有一个基本数据类型,所以语句中的数据类型应该一致。复合类型中,如引用,编译器以引用对象的类型作为auto的类型,其次,auto一般会忽略顶层const,保留底层const。如果希望推断出的auto类型是顶层const,需要前面外加const。

例子:

int i=0;const int ci=i;auto k=ci,&l=i;//k是整数,l是整型引用auto &m=ci,*p=&ci;//m是对整型常量的引用,p是指向整型常量的指针auto &n=i,*p2=&ci;//错误,类型不一样

C++11标准引入了第二张类型说明符decltype,它 的作用是返回操作数的数据类型。编译器分析表达式并得到它的类型,却不计算其值。与auto不同处还有,不忽略顶层const,本来是引用类型还是引用类型。

decltype((i)) d;//错误,d是int&, 结果是引用decltype(i) d;//d是int

2.6

类一般不定义在函数体内,若定义在外部,必须保持类的定义一致且只有能有一处该类的定义。类通常定义在头文件中,而且类所在头文件的名字应该与类名字一样。头文件包含只能被定义一次的实体。确保头文件多次包含仍能安全工作的常用技术是预处理器,预处理器是在编译之前执行的一段程序,可以部分的改变我们所写的程序。#include就是一项预处理功能,预处理器看到#include会用指定的头文件的内容代替#include。C++还用到的一项预处理功能是头文件保护符。#define #ifndef当且仅当变量未定义时为真,#ifdef当且仅当变量已定义时为真,一旦检测结果为真,执行后续操作直到遇到#endif指令为止。

#ifndef SALES_DATA_H#define SALES_DATA_H//...#endif

程序中预处理变量头文件保护符的名字必须唯一,通常是基于类名来构建保护符的名字,为了避免与程序中其他实体发生冲突,一般把预处理变量名全部大写。

                                             
0 0
原创粉丝点击