C++ Primer 第二章 变量和基本类型 笔记
第二章 变量和基本类型 笔记
2.1 基本内置类型
——C++定义了一组整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型。void类型没有对应的值,仅用在有有限的一些情况下,通常用作无返回值函数的返回类型。
类型 含义 最小存储空间
-bool 布尔型 ——
-char 字符型 8位
-wchar_t 宽字符型 16位
-short 短整型 16位
-int 整型 16位
-long 长整型 32位
-float 单精度浮点型 6位有效数字
-double 双精度浮点型 10位有效数字
-long double 扩展精度浮点型 10位有效数字
关于内置类型的摘要:
-short、int和long类型都表示整型值,存储空间的大小不同。一般,short类型为半个机器字长,int类型为一个机器字长,而long类型为一个或两个机器字长。
-bool类型表示真值true和false。可以将算术类型的任何值赋给bool对象。0值算术类型代表false,任何非0的值代表true。
-unsigned和signed类型有什么差别?
—前者为无符号类型,只能表示大于或等于0的正数。后者为符号类型,可以表示正数、负数和0。
-一般float类型用一个字(32位)来表示,double类型用两个字(64)来表示,longdouble类型用三个或四个字(96或128字)来表示。注意:float型只能保证6位有效数字,而double型至少可以保证10位有效数字。所以使用double类型基本上不会错了。
2.2 字面值常量(字符常量)
整型字面值规则
-以0开头的字面值整数常量表示八进制,以0x或0X开头的表示十六进制、
-字面值整数常量的类型默认为int或long类型。
浮点字面值规则
-默认浮点字面值常量为double类型。在数值的后面加上f表示单精度,加上L表示扩展精度。
-通常可以用十进制或者科学技术法表示浮点型常量。
布尔字面值和字符字面值
-用true和false表示布尔型字面值:bool test =false
-字符型值用一对单引号来定义,如:(‘a’)
转义字符常量
-都是以反斜线符号开始,如:(\n)
字符串常量
-用双引号括起来的零个或者多个字符表示,如:(“hello world”)
-注意:C++中所有字符串常量都由编译器自动在末尾添加一个空字符(‘\0’)
2.3 变量
-重要:程序中使用变量前必须先定义变量的类型。
-左值(lvalue):可以出现在赋值语句的左边或右边。
-右值(rvalue):只能出现在赋值的右边,不能出现在赋值语句的左边。
-左值就是变量的地址,右值就是变量的值。
-变量是左值,因此可以出现在赋值语句的左边。数字常量是右值,因此不能被赋值。
-什么是变量:具有名字的存储区,是有名字的对象。
-什么是对象:内存中具有类型的区域,计算左值表达式时就会产生对象。
变量名
-即变量的标识符,可以由字母、数字和下划线组成。变量名必须以字母或下划线开头,并且区分大小写字母,如:somename
-注意:标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。
-在函数外定义的标识符不能以下划线开头
定义对象
如:intunits_sold;
-以类型名开始 +标识符+;
-以分号结束定义
初始化
-两种初始化变量的形式:复制初始化和直接初始化。
如:int ival(1024);-直接初始化
Int ival=1024; -复制初始化
-注意:C++中初始化和赋值是两种不同操作。
声明和定义
-变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,有且只仅有一个定义。
-声明(declaration)用于向程序表明变量的类型和名字。
-定义也是声明:当定义变量时我们声明了它的类型和名字。
-不定义变量的声明包括对象名、对象类型和对象类型前关键字extern:
-如,extern int i;声明了变量名i并不定义它。
-extern声明不是定义,也不分配空间。
-只有当声明也是定义是,声明才可以有初始化式,因为只有定义才能分配存储空间。
-只有当extern声明位于函数外部时,才可以含有初始化式。
名字作用域
-局部变量:函数内部定义,还有语句作用域
-全局变量:函数外变量
2.4 const限定符
-const是关键字,用来定义常变量,即把一个对象转换成一个常量。
-注解:因为常量再定义后就不能被修改,所以定义时必须初始化。
-通过指定const变量为extern,就可以在整个程序中访问const对象,否则const变量只能是局部变量。
-注解:非const变量默认为extern,要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
2.5 引用
-重要概念:引用只是对象的另一个名字。
-是一种复合类型(compound type),添加“&”来定义
-引用必须用于该引用同类型的对象初始化:
int ival=1024;
int &refval=ival;
关于const引用
-const引用是指向const的引用
如:const intival=1024;
const int&refval=ival; 可以读取但不能修改refval,
-const引用可以初始化为不同类型的对象或者初始化为右值。
-注解:非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
typedef名字
-用来定义类型的同义词:typedef double wages;//wages是double的同义词
-typedef通常被用于以下三种目的:
为了隐藏特定类型的实现,强调使用类型的目的。
简化复杂的类型定义,使其更易理解。
允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
枚举(enum)
定义和初始化枚举
如:enumopen_modes(input,output,append);
包括以下几个部分:
关键字enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。
-用来初始化枚举成员的值必须是一个常量表达式。
类类型
-类定义以关键字class开始,其后是该类的名字标识符。类体位于花括号里面。
-注意:花括号后面必须要跟一个分号。
如:
class Sales_item{
public:
//operations on Sales_item objects willgo here
private:
std::string isbn;
unsigned units_sold;
double revenne;
};
解析:public和private被称为成员访问限定符,用它们来声明各成员的访问属性。
花括号里面的是类体,类体定义了组成该类型的数据和操作。
-操作称为成员函数,数据则称为数据成员
-注意:结构体(struct)跟类(class)的不同,它们定义类的唯一差别在于默认访问级别:默认情况下,struct的成员是public,而class的成员为private。还有一点,结构体没有构造函数。
编写自己的头文件
-头文件一般包含类的定义、extern变量的声明和函数的声明。
头文件的正确使用能够带来两个好处:
保证所有文件使用给定实体的同一声明;
当声明需要修改时,只有头文件需要更新;
-头文件用于声明而不是用于定义
-头文件可以定义类、值在编译就已知道的const对象和inline函数。
-一些const对象定义在头文件中为了是编译器能够看见其初始化式。
-如果const变量不是用常量表达式初始化,那么它不应该在头文件中定义。
预处理器的简单介绍
-#include指示只接受一个参数:头文件名
-重要:设计头文件时,应使其可以多次包含在同一个源文件中。
-预处理器变量有两种状态:已定义或未定义。
#define指示接受一个名字并定义该名字为预处理器变量。
#ifndef指示检测指定的预处理器变量是否未定义。如果未定义,那么跟在其后的所有指示都被处理,直到出现#endif。
注:如果头文件名括在尖括号(< >)里,那么认为该头文件是标准头文件。
如果头文件名括在一对引号里,那么认为它是非系统头文件。
总结:
本章的笔记到这里就是全部内容了,因为之前有一定的基础,学起本章来并不会吃力,我发现这本书的一些名称和叫法跟之前学谭伯伯的有些差别,对我来说,我更愿意谭伯伯那种叫法,比较通俗易懂,开始慢慢发现这本书有些东西解析复杂化了,新接触了一些新术语和内容,要我一下子能很好掌握,对我来说是一个挑战,为了能避免自己遗忘得太快,没结束一章,在三天内做笔记,把重要内容摘录下来。