第二章

标准库定义了4个IO对象:标准输入——cin标准输出——cout标准错误——cerr产生执行程序的一般信息——clog
2.3.3 初始化:

        C++有两种初始化格式:复制初始化和直接初始化

int ival=1024;     //复制初始化
int ival(1024);    //直接初始化

       初始化类类型对象时,复制初始化和直接初始化差别很微妙,详见13章,初始化内置类型对象时没有差别。

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

2.3.5 声明和定义

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

        声明:声明用于向程序表明变量的类型和名字,程序中变量可以声明多次但只能定义一次

        只有当声明也是定义时,声明才可以有初始化格式,因为只有定义分配存储空间

extern double pi=3.1416;    //definition and declaration
extern double;              //ok,declaration not definition
extern double pi=3.1416     //error:redefinition

2.5 引用

        非const引用只能绑定到与该引用同类型的对象,const引用则可以绑定到不相同但相关类型的对象或绑定到右值:

const int &r = 42;
double dval = 3.14;
const int &ri = dval;
int &ri = dval;           //error

2.7枚举

enum Points{point2d=2,point2w,point3d=3,point3w}

用来初始化枚举成员的值必须是一个常量表达式,即在编译时能够计算出结果的表达式。

枚举成员的值可以不唯一,在上例中point2d=point2w=3

枚举类型的对象初始化只能由其枚举成员或同一枚举类型的其他成员初始化:

Points pt3d = point3d;   // ok: point3d is a Points enumerator
Points pt2w = 3;         // error: pt2w initialized with int
pt2w = polygon;          // error: polygon is not a Points enumerator
pt2w = pt3d;             // ok: both are objects of Points enum type
2.9.1
        头文件用于声明而不是定义
         因为头文件包含在多个原文件中,所以不应含有变量或函数的定义(定义只能出现一次)

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

        编译时就知道的const对象的详细解释

        一般来说,常量表达式是编译器在编译时就能够计算出结果的表达式。当const 整型变量通过常量表达式自我初始化时,这个 const 整型变量就可能是常量表达式。而 const 变量要成为常量表达式,初始化式必须为编译器可见。为了能够让多个文件使用相同的常量值, const 变量和它的初始化式必须是每个文件都可见的。而要使初始化式可见,一般都把这样的 const 变量定义在头文件中。那样的话,无论该 const 变量何时使用,编译器都能够看见其初始化式。

        但是,C++ 中的任何变量都只能定义一次。定义会分配存储空间,而所有对该变量的使用都关联到同一存储空间。因为 const 对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件中是合法的。

        这种行为有一个很重要的含义:当我们在头文件中定义了 const 变量后,每个包含该头文件的源文件都有了自己的 const 变量,其名称和值都一样。
        const 变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式替换这些 const 变量的任何使用。所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的 const 变量。
        如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享。

2.9.2
        使用预处理器避免头文件的多重包含

        定义 Sales_item 类的头文件必须包含 string 库。 使用 Sales_item 头文件的程序也可能使用 string 库。该程序不会(也不应该) 知道 Sales_item 头文件使用了 string 库。 在这种情况下,string 头文件被包含了两次:一次是通过程序本身直接包含,另一次是通过包含 Sales_item 头文件而间接包含。 

#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif
        为了保证头文件在给定的源文件中只处理过一次,我们首先检测 #ifndef。第一次处理头文件时,测试会成功,因为 SALESITEM_H 还未定义。下一条语句定义了 SALESITEM_H。那样的话,如果我们编译的文件恰好又一次包含了该头文件。#ifndef 指示会发现 SALESITEM_H 已经定义,并且忽略该头文件的剩余部分。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值