您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 读书笔记 变量和基本类型

2008-07-17 23:17 232 查看
类型是所有程序的基础。类型告诉我们数据代表什么意思以及可以对数据执行哪些操作。C++ 中定义了一些基本的内置数据类型:表示整数、浮点数、单个字符和布尔值的算术类型,和一种称为void的特殊类型,通常用作无返回值函数的返回类型。

类型 含义 最小存储空间(因机器不同而有所不同)
bool 布尔型 ――(可以将算术类型的任何值赋给bool对象)
char 字符型 8位
wchar_t 宽字符型 16位
short 短整型 16位
int 整型 16位(大多数通用机器都是使用32位)
long 长整型 32位
float 单精度浮点型 6位有效数字(32位表示)
double 双精度浮点型 10位有效数字(64位)
long double 扩展精度浮点型 10位有数字(96或128位)

这里要注意一下bool类型,bool类型只有两种状态true 和 false,但是可以将算术类型的任何值赋给bool对象,0值自述类型代表false,任何非0的值都代表true。

除bool类型外,整型可以是带符号的(可以表示负数和正数)也可以是无符号的(只能表示非负数)。int、short、 long默认为带符号类型,可以用unsigned 指定为无符号的。

字面值常量
可以用十进制、八进制、和十六进制定义字面值整数常量,这些进制不会改变其二进制位的表示形式。以0(零)开头的字面值整数常量表示八进制,以0x或0X开头的表示十六进制。通过在数值后面加L 指定常量为long类型,加U为unsigned的类型。字面值常量的类型默认是int或long类型,没有short类型的字面值常量。
默认的浮点字面值常量为double类型,在数值的后面加上F(f)来表示单精度,加上L表示扩展精度。
对于字符字面值,分为可打印和非打印字符,可打印的字符型字面值通常用一对单引号来定义,不可打印字符实际上是不可显示的字符。不可打印字符和特殊字符都用转义字符书写,以反斜线符号开始,如果换行符/n 。我们可以将任何字符表示为/ooo(ooo表示三个八进制数字)或/xddd(ddd表示三个十六进制数字)形式的通用转义字符。记住字符’/0’通常表示“空字符”。
字符串字面值常量用双引号括起来的零个或者多个字符表示,不可打印字符表示成相应的转义字符。为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。

变量
C++是一门静态类型语言,在编译时会作检查,程序中使用变量前必须先定义变量的类型。C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的取值范围以及可应用在该变量上的操作集。
左值:左值可以出现在赋值语句的左边或右边。
右值:右值只能出现在赋值的右边,不能出现在赋值语句的左边。
变量名的命名规则:可以由字母、数字和下划线组成,但必须以字母或下划线开头,并且区分大小写字母,不能使用C++保留的关键字和各种操作符的替代名用作变量名;变量名不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母,在函数外定义的变量名不能以下划线开头。
变量的初始化:初始化是指创建变量并给它赋初始值,但它不是赋值,赋值是擦除对象的当前值并用新值代替。C++支持两种初始化变量的形式:复制初始化(用=号)和直接初始化(放在括号里),如:
int ival(1024); // 直接初始化
int ival = 1024; // 复制初始化
现在我们不需要一定要清楚这两者之间的区别,我们只需要知道,直接初始化语法更灵活且效率更高。
当定义没有初始化式的变量时,系统有时候会帮我们初始化变量。对于内置类型的变量,在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。
对于类类型变量,通过一个或多个构造函数来控制对象的初始化。如果定义某个类的变量时没有提供初始化式,那么就会使用默认构造函数(不管定义在哪里)。但是有些类没有默认构造函数,对于这些类来说,每个定义都必须提供显式的初始化式,没有初始值是根本不可能定义这种类型的变量的。

C++程序通常由许多文件组成,为了让多个文件访问相同的变量,C++区分了声明和定义。
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
声明用于向程序表明变量的类型和名字(定义也是声明),可以通过使用extern关键字声明变量名而不定义它。声明变量(但不定义)的格式如下:
extern 对象类型 对象名;
如:
extern int i; // 声明变量i,但是没有定义
int i; // 声明、同时定义变量i
extern声明不是定义,也不分配存储空间,它只是说明变量定义在程序的其它地方。程序中变量可以声明多次,但只能定义一次。如果声明有初始化式,那么它可被当作是定义,如:
extern double pi = 3.1416;
只有当extern声明位于函数外部时,才可以含有初始化式。

名字的作用域
用来区分名字的不同意义的上下文称为作用域。C++中,大多数作用域是用花括号来界定的。一般来说,名字从声明点开始直到其声明所在的作用域结束处都是可见的。定义在所有函数外部的名字具有全局作用域,可以在程序中的任何地方访问。在函数体内的名字具有局部作用域,在整个函数内可见,但在函数外不可见。
C++中作用域可以嵌套,定义在全局作用域中的名字可以在局部作用域中使用,名字还可以在内部作用域中重新定义(局部变量最好使用不同的名字)。

const限定符
const限定符把一个对象转换成一个常量,如:
const int bufSize = 512;
定义bufSize为常量并初始化为512。因为常量在定义后就不能被修改,所以定义时必须初始化。
const对象默认为文件的局部变量,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,些变量只存在于那个文件中,不能被其它文件访问。非const变量默认为extern。要使const变量能够在其它的文件中访问,必须显式地指定它为extern。

引用
引用就是对象的另一个名字,主要用作函数的形式参数。引用是一种复合类型,通过在变量前加“&”符号来定义。复合类型是指用其他类型定义的类型。不能定义引用类型的引用,但可以定义其它任何类型的引用。而且引用必须用与该引用同类型的对象初始化。指向const对象的引用称作const引用,如:
const int ival = 1024;
const int &refVal = ival; // 正确,引用和对象都是const
int &ref2 = ival; // 错误,无法从const int 转化为 int &ref2
非const引用只能绑定到与该引用同类型的对象。const引用则可以绑定到不同但相关的类型的对象或绑定到右值。

枚举类型
枚举类型的定义格式:
enum 枚举类型名 {成员0,成员1,成员2,……};
默认情况下,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1。枚举成员是常量,只能在定义的时候初始化,而且只能用整型的常量表达式初始化枚举成员。而且每个enum只定义一种唯一的类型。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。找出下面代码的错误:
int i = 3;
enum en {input = i,output,append};
en val1 = input;
en val2, val3,val4;
val3 = output;
val2 = val1;
val4 = 5;
int v = output;
std::cout << v << std::endl;

类类型
C++中,通过定义类来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对象可以执行的操作。每个类都定义了一个接口和一个实现。定义类时,通常先定义该类的接口,即该类所提供的操作。类定义以关键字class开始,其后是该类的名字标识符。类体位于花括号里面。花括号后面必须要跟一个分号。类体中定义组成该类型的数据和操作,成为类的成员:操作称为类的成员函数,数据称为数据成员。当定义数据成员时,只能指定该数据成员的名字和类型,不能初始化,通过构造函数控制初始化。还可以用struct关键字定义类,它和class的唯一区别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。类中public部分定义的成员在程序的任何部分都可以访问。而不是类的组成部分的代码不能访问private成员。

编写头文件的一些原则:
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。但也有三个例外:头文件可以定义类、值在编译时已知道的const对象和inline函数。这些实体可以在多个源文件中定义,只要每个源文件中的定义是相同的。如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其它的变量一样,该const变量应该在一个源文件中定义并初始化(显式地指定为extern)。应在头文件中为它添加extern声明,以使其能被多个文件共享。头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。头文件保护符的编写格式如下:
#ifndef 标识符
#define 标识符
……
……
#endif
请参考#ifndef#define#endif的用法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: