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

《C++Primer》 第二章 变量和基本类型

2010-08-16 21:54 441 查看
各种程序设计语言都具有许多独具特色的特征,这些特征决定了用每种语言适合开发哪些类型的应用程序。

程序设计语言也有一些共同的特征:

内置数据类型;

表达式和语句:用于操纵上述类型的值;

变量;

控制结构;

函数。

大多数现代程序设计语言都采用两种方式扩充上述基本特征集:

1.允许程序员通过自定义数据类型扩展该语言;

2.提供一组库例程,这些例程定义了一些并非内置在语言中的使用函数和数据类型。

基本内置类型

bool 布尔型 不定

char 字符型 8位

wchar_t 宽字符型 16位

short 短整型 16位

int 整型 16位

long 长整型 32位

float 单精度浮点型 6位有效数字

double 双精度浮点型 10位有效数字

long double 扩展精度浮点型 10位有效数字

命名习惯最重要的是保持一致。特别是在多人协同时。

变量名即变量的标识符(identifier),可以由字母、数字和下划线组成。必须以字母或下划线开头,且区分大小写字母。

变量名不能是C++关键字和操作替代名。

C++标准还保留了一组标识符用于标准库。标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。

有些标识符(在函数外定义的标识符)不能以下划线开头。

int 是C++内置类型,std::string是标准库定义的类型。

可以这样定义:

int month,

day,

year;

变量的初始化。

两种初始化变量的方式:复制初始化(copy-initialization)和直接初始化(direct-initialization)。

int ival(1024); 直接初始化

int ival = 1024; 复制初始化

初始化不是赋值。

初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。

它们两者的区别很微妙。直接初始化语法更灵活且效率更高。

使用多个初始化式

定义如何进行初始化的成员函数称为构造函数(constructor)。

std::string all_nines(10,'9'); all_nines = "9999999999"

这里,初始化all_nines的唯一方法是直接初始化。有多个初始化式时不能使用复制初始化。

初始化多个变量

对象的名字立即变成可见,所以可以用同一个定义中前面已定义变量的值初始化后面的变量。

已初始化变量和未初始化变量可以在同一定义中定义。两种形式的初始化文法可以相互混合。

double salary = 9999.9;

wage(salary + 0.1);

对象可以用任意复杂的表达式(包括函数的返回值)来初始化:

double sale_price = a();

声明和定义

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

声明 用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。

使用extern关键字可以声明变量名而不定义它。

extern int i; // declares but does not define i

int i; // declares and defines i

extern声明不是定义,也不分配空间。它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,!!但只能定义一次。

如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern:

extern double pi = 3.1416; //definition

只有当extern声明位于函数外部时,才可以含有初始化式。

名字的作用域

在程序中可以多次使用同一个名字,只要它用在不同的上下文中,且通过这些上下文可以区分该名字的不同意义。

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

C++中,大多数作用域使用花括号来界定的。

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

在函数内部定义的名字有局部作用域(local scope),只能在函数内部使用。

而在语句中定义的名字比如for语句有语句作用域(statement scope),只能在这个语句中使用。

C++中作用域可嵌套

定义在全局作用域中的名字可以在局部作用域中使用,而全局和局部的也可以在语句作用域中使用。即范围大的能在范围小的中使用。

名字还可以在内部作用域中重新定义。

局部变量的重定义能屏蔽(hide)全局变量。

但是局部变量最好使用不同的名字。

C++中海油另外两种不同级别的作用域:类作用域(class scope)和命名空间作用域(namespace scope)

通常把一个对象定义在它首次使用的地方是一个很好的方法。

const限定符

定义一个变量代表某一常数的方法仍然有一个严重的问题。即它可以被有意或无意地修改。

const限定符提供了一个解决办法,它把一个对象转换成一个常量。

const int bufSize = 512;

定义bufSize为常量并初始化为512.任何修改bufSize的尝试都会导致编译错误。

const对象末仍为文件的局部变量,可以加上个extern 指定为 全程序都可用。

引用(reference),间接引用,const引用。

typedef名字

typedef通常被用于以下三个目的:

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

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

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

枚举(enumeration),关键字 enum,枚举成员是常量,成员第一个默认为0,其后依次加1.

类类型

每个类(class)都定义了一个接口(interface)和一个实现(implementation)。

接口即该类所提供的操作。

class Sales_item

{

public:

// 操作

private:

std:string isbn;

unsigned units_sold;

double revenue;

}; //千万别忘了这个分号@

类可以为空,类体定义了组成该类型的数据和操作,成为类的成员(member),操作称为成员函数,而数据称为数据成员(data member)。

使用该类的代码可能只能访问public成员。

struct关键字,相当于class的public;

class中如果不写public和private,则默认为private;

头文件(header file)

多个文件分别编译(separate compilation),

头文件为相关声明提供了一个集中存放的位置。头文件一般包括类的定义、extern变量的声明和函数的声明。

头文件的好处:

保证所有文件使用给定实体的同一声明;

当声明需要修改时,只有头文件需要更新。

如果头文件太大,可能编译时间会很长,为了减少处理头文件的编译时间,可以预编译头文件。

注意,头文件用于声明而不是用于定义。只能是extern 类型 名字; //extern不能少,否则就是定义了。

对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知的const对象和inline函数。

这些实体可以在多个源文件中定义,只要都是相同的。

#include设施是C++预处理器(preprocessor)的一部分。在编译器之前运行。

头文件保护符(header guard)可以避免多重包含

#ifndef SALESITEM_H

#define SALESITEM_H

//

#endif

头文件应该含有保护符,即使这些头文件不会被其他头文件包含。

头文件如果被包含多次可能会引起难以理解的编译错误。

#include <standard_header>

#include "my_file.h"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: