第2章 变量和基本类型
1、 变量直接初始化和变量复制初始化
int ival(1024); //direct-initialization
int ival = 1024; //copy-initialization
“初始化不是赋值”。
2、内置类型复制初始化和直接初始化几乎没有区别;但对类类型对象来说,有些初始化只能用直接初始化完成。
3、未初始化变量时,系统有时会自动初始化。
内置类型变量在函数外定义时被系统初始化为0,在函数体内则不进行初始化,建议每个内置类型对象都要初始化(这是个好的习惯)。;类类型用构造函数进行初始化,大部分类类型具有默认构造函数,可以为对象进行隐式初始化,有些类类型没有默认构造函数,每个定义必须显式提供初始化式,否则根本不能定义该类型变量。
4、 变量的声明和定义
一次定义多次声明。
定义,为变量分配内存存储空间,还可以赋初值。在一个程序中变量有且仅有一次定义。
声明,定义也是声明,还可以只声明不定义,即用使用关键字:extern。extern 声明不是定义,没有分配内存空间,事实上,他只说明变量定义在程序的其他地方。
如果声明有初始化式,那么它可被当成定义,即使声明标记为extern:
extern int ival = 3; //definition
注意:只有extern声明在函数外时才能含有初始化式。
通常把一个对象的定义在首次使用之前是一个很好的方法(个人认为,在大型程序中这样定义会使程序看起来凌乱)。
6、const限定符
因为常量定义后就不能修改,所以定义时必须初始化。
const std::string hi = "hello world"; //ok initialized
const int i, j = 5; //error :i is uninitialized const
const对象默认为文件的局部变量。
//file_1.cc
int counter; //define
//file_2.cc
extern int counter; //use counter form file_1.cc
counter++;
//file_1.cc
extern const int bufSize = 512; //define
//file_2.cc
extern const int bufSize ; //use bufSize form file_1.cc
bufSize ++;
非const变量默认为extern.要使const变量能在其他文件中访问,必须显示指定它为extern.
5、引用(reference)
实际应用中引用主要用做函数的形式参数。不能定义引用类型的引用,但能定义其他任何类型的引用。当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象上。引用仅仅是对象的另一个名字。
引用必须用和该引用同类型的对象进行初始化。例如下:
Int ival = 1024;
Int &refVal = ival; //ok:refVal refer to ival
Int &refVal2; //error:a reference must be initialized
Int &refVal3 = 10;//error:initializer must be an object
Const 引用时指向const对象的引用
Const int ival = 1024;
Const int &refVal = ival;//ok:both reference and object are const
Int ref2 = ival;//error:nonconst reference refer to a const object
非const引用只能绑定到与该引用相同类型的对象
const引用则可以绑定到不同但相关类型的对象或右值(如:42)。
Int ival =42;;
Const int &r = 42;//legal 但是非const引用就不合法。
Const int &r2 = r + ival;//legal
之所以const引用可以绑定到不同但相关类型的对象上,是因为存在类型的隐式转换,如:
Double dval = 3.14;
Const int &ri = dval;
编译器会把代码改编成如下形式:
Int temp = dval;
Const int &ri =temp;//ri其实绑定的是临时变量。
7、类类型
除了class关键字外还可以用struct关键字定义类。两者的唯一区别在于默认访问级别不同:struct成员为public,而class的成员为private,即定义在第一个访问标号(private或public)前的成员都隐式的定义为默认级别。
8、编写自己的头文件
因为头文件包含在多个源文件中,所以不能含有函数和变量定义。但有三个例外,头文件可以定义类,值在编译时就已经知道得const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
在头文件中定义是因为编译器需要知道他们的定义来产生代码。如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。当我们在头文件中定义const变量后,每个包含头文件的源文件都有了自己的const变量,其名称和值都一样。当const变量是用常量表达式进行初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分编译器在编译时都用常量表达式来替换const变量的使用。所以在实践中不会有任何存储空间用于存储用常量表达式进行初始化的const变量。
使用与处理器变量避免多重包含。
#ifndef SALESITEM_H
#define SALESITEM_H
//
#endif