【30天学习C++ primer系列】day2:基础拾忆之变量和基本类型(1/2)。-20160111


写在前面学习贵在坚持。每天25page啃掉《C++ primer》这本大山书。走在编程路上的小伙伴们共勉。


完整系列

【30天学习C++ primer系列】day1:新的征程。-20160110

【30天学习C++ primer系列】day2:基础拾忆之变量和基本类型(1/2)。-20160111


知识点提要:1. 基本内置类型、2. 变量、3. 复合变量

对应内容:《C++ Primer(第五版)》【P26-P53】第二章:变量和基本类型(2.1-2.3)


1. 基本内置类型

包含了算数类型(char, int, bool, float等)和空类型(void)。空类型不对应具体值,在一些特殊场合运用。

(1)算数类型:分整型(int, bool, char)和浮点型。

-- 以下仅罗列C++的算数类型,具体不做记忆。(bool, char, wchat_t:宽字符, char16_t:Unicode字符, char32_t, short, int, long, long long, float, double, long double)。

-- 带符号和无符号类型:除bool和扩展的字符型外,带符号可表示正、负数和0;无符号只能表示非负数。其中,int、short、long、long long都带符号。可以通过加unsigned变为无符号类型。字符型分为:char、signed char、unsigned char。char有无符号由编译器决定。

(2)类型转换--当某类型强行赋值给另一类型

-- 布尔值:0为false,非0值为true。布尔值到其他类型一样。

-- 浮点数 to 整数:仅保留小数前部分;整数 to 浮点数,小数部分记为0。

-- 无符号类型赋一个超范围的值,为初始值对总数取模后的余数。例如8bite的unsigned char表示0-255,如附区间外值,为对256取模后的余数。-1赋给它结果是255。

-- 带符号类型附超范围的数,结果是undefined,程序可能继续工作、崩溃或生产垃圾数据。

(3)含无符号类型的表达式

-- 无符号和int混用时,int会转成无符号值(按取模原则)。包含无符号值的运算,最后结果一定不会是负值(取模原则转换)

-- 忠告:不要混用带符号和无符号类型。

(4)字面值常量:用来初始化变量

-- 42,1,024,0x14,3.1415都是字面值常量。它的形式和值决定了数据类型。

-- 字符和字符串字面值:'a':字符字面值,用单引号;"Hello":字符串字面值,用双引号。如果两个字符串字面值相邻且仅由空格、缩进或换行符分隔,他们是一个整体。

-- 转移序列:仅做列出(\n换行, \t制表符, \b退格, \\反斜线, \r回车, \", \', \?)

-- 布尔值字面:ture 和 false;指针字面:nullptr。


2. 变量

变量和对象在C++中是一个意思。

(1) 定义:类型说明符 + 一个或多个变量名列表,以逗号分隔,分号结束。例如:

int sum = 0, value, units_sold = 0;
Sales_item item;
std::string book( " 1-2-3-X");//book通过string字面值初始化
-- 初始值:用来初始化变量,可以用先定义的变量值初始化后定义的变量值。

-- 列表初始化:用花括号来初始化

double price = 31.99, discount = price * 0.6;
int i = {0};
int i{0}, b{i};
-- 默认初始化:函数体外变量默认初始化为0或空,函数体内内置变量不被初始化


(2)声明和定义的关系:extern

C++支持分离式编译。允许声明和定义区分写。声明使名字为程序所指,文件使用别处定义的名字必须包含对该名字的声明。定义负责创建与名字关联的实体。

-- extern:声明变量而非定义它,不能显示初始化。一旦包含了显示初始化即为定义。

-- 如果多个文件使用同一变量,必须将声明和定义分离。定义能且只能出现在一个文件,其他文件使用该变量必须声明,不能重复定义。

-- C++是静态类型语言,编译会查类型,类型决定了能参与的运算是否被支持,在执行类型不支持的运算时会报错不能生成可执行文件。静态类型检查在复杂的程序中有利于发现问题。


(3)标识符:字符、数字、下划线,大小写敏感

命名规范有几点:体现实际意义、变量名小写开头、自定义类名大写开头、由多个单词组成要明显区分(student_loan或studentLoan)


(4)作用域(scope):全局作用域、块作用域

-- 看花括号分隔

-- 名字有效区始于声明,终于声明语句所在作用域末端

-- 嵌套作用域,内层和外层。在内层作用域显示访问外层作用域变量时,加::。


3. 复合类型:引用和指针。

这一节有点小晕,不过也还好。就是引用,指针,指针的引用,引用的指针,指针的指针,引用的引用。。。。

(1)引用:对象的别名,用&变量形式定义,引用必须初始化。例如:

int val = 1024;
int &rval = val; //rval是val的引用
rval = 2; //把2赋给rval引用的对象,也就是val。
int li = rval; //等价于 li = val,用rval绑定的值初始化li
int &rval2 = rval; //rval2绑定到rval也就是val上
-- 引用的初值必须是个对象,而且与引用前类型相同。


(2)指针

-- 指针的初始化:

int val = 1024;
int *p = &val;
p中存放val的地址,用取地址符&赋给p。int * 表明p是个指针变量,指向int类型变量。所指对象类型不同的指针不能相互赋值。

-- 指针值的4种状态:指向一个对象(通过存放该对象的地址);指向紧邻对象的下一个位置;空指针;无效指针。

-- 通过指针访问对象:

int val = 1024;
int *p = &val;
cout << *p;
*p = 0;
cout << val << *p;
*,解引用符,通过*p操作等价于对val操作。

-- 空指针。nullptr。生成空指针的几个方法:

int *p1 = nullptr;
int *p2 = 0;
//#include cstdlib后
int *p3 = NULL;
-- 忠告:给所有的指针初始化。


(3)指针和引用

-- 引用本身不是一个对象,一旦定义并初始化之后,无法解绑到其他的对象上。指针由于存放的是所指对象的地址,给指针赋值就是放一个新的地址,实现指向一个新的对象。

-- 对指针的判断操作:if(pi),如果pi值是0,为false,否则,为true

-- void指针,不知道所指对象的类型,可以存放任意类型,但不能通过void * 指针操作所指对象


(4)复合类型的声明

int *p1, p2; //p1是指向int的指针,p2是int
int *p1, *p2;
int val = 1024;
int *pi = &val;
int **ppi = π //指向指针的指针
cout << **ppi << *pi << val;
//引用不是对象,没有指向引用的指针,但有绑定指针的引用
int * &r = pi; //r是指针pi的引用
r = &i;//等于pi = &i
*r = 0; //等于*pi = 0; i = 0;






你可能感兴趣的:(C++)