第2章:变量和基本类型

转载请注明原文出处:http://blog.csdn.net/roddick621

以下的知识点全部都是来自于C++ Primer 第四版,如果需要详细了解的话,可以查看原版的书籍。


1.基本内置类型

类型 含义 最小存储空间
bool 布尔型 --
char 字符型 8位
wchar_t 宽字符型 16位
short 短整型 16位
int 整型 16位
long 长整型 32位
float 单精度浮点型 6位有效数字(32位)
double 双精度浮点型 10位有效数字(64位)
long double 扩展精度浮点型 10位有效数字(96/128位)

1.1整型

    表示整数、字符(char和schar_t)和布尔型的算术类型合称为整型(integral type)。

    除了bool类型外,整型是可以带符号的(signed),也可以是无符号的(unsigned)。无符号类型中,所有位数都表示数值。如果在某种机器中,定义了一种类型使用8位表示,那么这种类型的unsigned型就可以表示0-255(2^8-1)。如果是有符号的话,它需要用一位来表示符号位,符号位为1,值为负数,符号位为0,值位整数。所以有符号数表示的范围就为-(2^7-1)到(2^7-1)。


1.2浮点型

    类型float、double和long double分别用于表示单精度浮点数、双精度浮点数和扩展精度浮点数。


2.字面值常量

    像42这样的值,在程序中被当作为字面值常量。称之为字面值是因为它只能够用它的值来称呼它,称之为常量是因为它的值不可以改变。

2.1整型字面值规则

     可以用三种进制的格式 :

20:十进制

024:八进制

0x14:十六进制

    字面值常量的类型默认为int或者long(根据需要而定),或者可以通过增加后缀转换为long,unsigned或者unsigned long类型。eg:128u(unsigned),1024UL(unsigned long),1L(long)

2.2浮点字面值规则

    通常可以用十进制或者科学计数法来表意。科学计数法的指数使用E或者e来表示。默认的浮点字面值常量为double类型。在后面加上F或者f表示单精度。加上L或者l表示扩展精度。

2.3布尔字面值和字符字面值

    单词true和false是布尔型的字面值。在字符字面值前加L就能够得到wchar_t类型的宽字符字面值。

2.4非打印字符的转义序列。

换行符 \n 水平制表符 \t
纵向制表符 \v 退格符 \b
回车符 \r 退纸符 \f
报警符 \a 反斜线 \\
疑问号 \? 单引号 \'
双引号 \"  
   

2.5字符串字面值

    字符串字面值常量用双引号括起来的零个或者多个字符表示。不可打印字符表示成相应的转义字符。为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符\0。

2.6字符串字面值的连接

    两个相邻的仅由空格、制表符或换行符分开的字符串字面值,可以连接成一个新的字符串字面值。


3.变量

    变量提供了程序可以操作的有名字的存储区。C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可阴功在该变量上的操作集。C++程序员常常把变量成为“变量”或者“对象”。

左值(lvalue):左值可以出现在赋值语句的左边或者右边。

右值(rvalue):右值只可以出现在赋值的右边,不能出现在赋值语句的左边。

3.1变量名

    变量名,即变量的标识符,可以由字幕、数字和下划线组成。变量名必须以字幕或者下划线开头,并且区分大小写。并且C++保留了一组词作为该语言的关键字,关键字也不能作为程序的标识符。

3.1.1定义对象

     每个定义都是以类型说明符开始,后面紧跟着以逗号分开的含有一个或者多个说明符的列表,分号结束定义。eg: int units_sold;

3.1.2初始化

     变量定义指定了变量的类型和标识符,也可以为对象提供初始值。定义时指定了初始值的对象被称为是已初始化的。C++提供的复制初始化直接初始化。复制初始化语法用等号(int ival=1024),直接初始化是把初始化式放在括号中(int ival(1024))。对于内置类型来说,复制初始化和直接初始化几乎没有差别。对于类类型的对象来说,有些初始化仅能用直接初始化来完成。

3.1.3变量初始化规则

    当定义的没有初始化式的变量时,系统有时候会帮我们初始化变量。初始化什么样的值取决于变量的类型,也取决于变量的位置。

1.内置类型变量的初始化。内置类型变量是否初始化取决于变量的位置。在函数体外定义的变量都初始化为0,在函数体类定义的内置类型不进行自动初始化。

2.类类型变量的初始化。类中都有一个默认构造函数,无论变量在哪里定义,如果没有初始化,都会调用这个函数进行初始化。

3.1.4声明和定义

C++通常又许多文件组成,为了让多个文件访问相同的变量,C++区分了声明和定义。

定义(definition):用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

声明(declaration):用于向程序声明变来那个的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。例如:extern int i;(这里就是只作声明,不作定义)。extern声明不是定义,也不会分配存储空间。事实上,它只是说明了变量定义在程序的其他地方。程序中变量可以声明多次,但只能够定义一次。只有当声明也是定义时,声明才可以有初始化,因为只有定义才分配存储空间。如果声明有初始化,那么它可以被当作是定义,几时声明标记为extern。eg: extern double pi=3.1416; 虽然使用了extern,但是这条数据还是定义了pi,分配并且初始化了存储空间。只有当extern声明位于函数外不是,才可以函数初始化式。

3.1.5名字的作用域

用来区分名字的不同意义的上下文成为作用域(scope),作用域是程序的一段区域,一个名称可以和不同作用域中的不同实体相关联。

全局作用域(golbal scope):在所有函数外部的名字,可以在程序中任何地方访问。

局部作用域(local scope)

语句作用域(statement scope)


4.const限定符

4.1定义const对象

const提供了把一个对象转换成一个常量的方法。


4.2const对象默认为文件的局部变量

在全局作用域里定义非const变量时,它的整个程序中都可以访问(非const对象默认为extern):

//file_1.cpp
int counter; //definition

//file_2.cpp
extern int counter; //uses counter from file_1
++counter; //increments counter defined in file_1
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。通过指定const变量为extern,才可以在整个程序中访问const对象:

//file_1.cpp
extern const int bufSize = fcn(); //defines and initializes

//file_2.cpp
extern const int bufSize; //uses bufSize from file_1
for (int index=0; index != bufSize; ++index)
    //...


5.引用

    引用(reference)就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。引用是一种复合类型(compound type),通过在变量名前添加“&”符号来定义。复合类型是指用其他类型定义的类型。

    eg:  int ival = 1024;   int $refVal = ival;


6.typedef名字

    typedef定义以关键字typedef开始,后面是数据类型和标识符(eg : typedef double wages; wages hourly , weekly;  //定义了double类型的hourly和weekly) 。标识符或者类型名并没有引入新的类型,而只是现在数据类型的同义词。typedef名字可以出现在程序中类型名可出现的任何位置。typedef通常被用于一下三种目的:

    为了隐藏特定类型的实现,强调使用类型的目的。

    简化复杂的类型定义,使其更容易理解。

    允许一种类型用于多个母的,同事使得每次使用该类型的目的明确。


7.枚举

    枚举(enumeration)定义了整数整数常量集,而且还把他们聚集成组。

7.1定义和初始化枚举。

    枚举的定义包括关键字额怒骂,气候是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表。 eg : enum open_modes {input, output, append};  默认地第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1。

7.2枚举成员是常量。

    可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式(constant expression)。

//shape is 1, sphere is 2, cylinder is 3, polygon is 4
enum Forms {share=1, sphere, cylinder, polygon};
//point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points {point2d=2, pint2w, point3d=3,point3w};

7.3每个enum都定义了一种唯一的类型。

    每个enum都定义了一种新的类型。和其他类型一样,可以定义和初始化Point类型的对象,也可以以不同的方式来使用这些对象。枚举类型的对想的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。


8.类类型

    C++中,通过定义类(class)来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对性爱那个可以执行的操作。

8.1从操作开始设计类。

    每个类都定义了一个接口(interface)货一个实现(implementation)。接口由使用该类的代码需要执行的操作组成。实现一般包含该类所需要的数据。实现还包括了定义该类需要的但又不供一般性使用的函数。定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。

8.2定义类

    类定义以关键字class开始,其后是该类型的名字和标识符。累体位于花括号里面。花括号后面必须要跟一个分号。

class Sales_item {
public:
    // operations on Sales_item objects will go here
private:
    std::string isbn;
    unsigned units_sold;
    double revenue;
};

8.3类的数据成员。

    定义类的数据成员和定义普通的变量有些相似。但是定义变量和定义数据成员存在非常重要的区别:一半不能把数据成员的初始化作为定义的一部分。当定义数据成员时,只能指定数据成员的名字和类型。类不是在类定义里定义数据成员时初始化的,而是通过成为构造函数的特殊成员函数控制初始化。

8.4访问标号

    访问标号负责控制使用该类的代码是否可以使用指定的成员。类的成员函数可以使用类的任何成员,而不管起访问级别。类中publie部分定义的成员在程序的任何部分都可以访问。不是类的组成部分不能访问private成员。

8.5使用struct关键字。

    C++只是另一个关键字struct,它也可以定义类类型。如果使用class关键字定义类,那么定义在第一个访问标号前的任何成员都饮食定义为private;如果使用struct关键字,那么这些成员都是public。使用class还是struct关键字来定义类,仅仅影响默认初始访问级别。


9.编写自己的头文件。

9.1设计自己的头文件。

    头文件为相关声明提供了一个集中存放的位置。文件件一边包含类的定义、extern变量的声明和函数的声明。头文件的正确使用能够带来两个好处:保证所有文件使用给定实体的同一声明;当声明需要修改时,只要有头文件需要更新。设计头文件还需要注意一下几点:头文件中所做的声明在逻辑上应该是适于放在一起的。编译头文件需要一定的时间。如果头文件他打,程序员可能不愿意承受包含头文件所带来的编译时带来的带价。

9.2头文件用于声明而不是用于定义。

    当设计头文件时,记住定义和声明的区别是很重要的。定义值可以出现一次,而声明则可以出现多次。下面的语句是一些定义,所以不应该出现在头文件里:extern int ival=10;  double fica_rete;   同一个程序中有两个以上文件含有上述一个定义将会导致多种定义的连接错误。

    对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时已经知道的const对象和inline函数。这些实体可以在多个源文件中定义,只要每个源文件的定义是相同的。

9.3避免多重包含

    在编写头文件之前,我们需要引入一些额外的预处理器设置。预处理器允许我们自定义变量。为了避免名字冲突,预处理器变量经常全用大写字母表示。

    预处理器有两种状态:以定义和未定义。定义预处理器变量和检测器状态所用的预处理器指示不同。#define 指示接受一个名字并定义该名字为预处理器变量。 #ifndef 指示检测指定的预处理器变量是否定义。如果未定义,那么跟在气候的所有指示都被处理,直到出现#endif。

#ifndef SALESITEM_H
#define SALESITEM_H
    //Definition of Sales_item class related functions goes here
#endif


    












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章