《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"
程序设计语言也有一些共同的特征:
内置数据类型;
表达式和语句:用于操纵上述类型的值;
变量;
控制结构;
函数。
大多数现代程序设计语言都采用两种方式扩充上述基本特征集:
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"
相关文章推荐
- C++Primer 学习笔记 第二章(变量和基本数据类型)
- [C++Primer] 第二章 变量和基本类型
- 《C++primer(第五版)》学习之路-第二章:变量和基本类型
- c++primer第五版习题---第二章变量和基本类型
- c++primer第二章读书笔记---变量和基本类型
- C++Primer 4 第二章 变量和基本类型
- C++ primer 学习笔记(第二章:变量和基本类型)
- 第二章-变量和基本类型2
- C++Primer第五版【学习笔记】——第二章 变量和类型
- c++primer 学习笔记(2.0)变量和基本类型
- 第二章 变量和基本类型——2.3 变量
- 第二章 头文件、变量和基本类型(1)——头文件
- 第二章 变量和基本类型(续3)类类型 & 编写自己头文件
- 第二章 变量和基本类型
- C++Primer第二章(变量和基本类型)笔记
- 第一部分 基本语言 第二章 变量和基本类型(2.3.6名字的作用域)(2.3.7在变量的使用处定义变量)
- C++Primer笔记 第二章 变量和基本类型
- C++Primer 变量和基本类型
- 第一部分 基本语言 第二章 变量和基本类型(2.3.4变量初始化规则)
- 读《C++Primer》第二天——变量和基本类型