好久都没有使用C++写过代码了,一直都在用C或者一些脚本语言。最近似乎因为工作需要,又要用C++了,觉得有必要再翻一遍《C++ Primer》,重温一下C++中有但C中没有的特性了。

1. 输出流与输入流

输出流: std::cout << "print to stream" << std::endl;

输入流: std::cin >> v1;

endl是一个特殊值,将它写入输出流中时,具有换行的效果,并刷新与设备关联的缓冲区。

2. 声明和定义

声明(declaration)用于向程序表明变量的类型和名字。我们使用extern关键字声明变量而不定义它。

定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。

变量与声明的一些区别:

  • 声明不会分配空间,定义会分配空间;
  • 一个程序中,变量可以有多个(相同的)声明,但有且只能有一个定义。

下面我们看几个例子:

extern int i;	// 声明但不定义i
int i;          // 声明并且定义i

extern double pi = 3.14;    // 虽然使用了extern关键字,但因为初始化了变量,分配了存储空间,所以依旧是定义,而不是声明

 NB:任何在多个文件中使用的变量都需要有与定义分离的声明。这样,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。

在声明和定义的问题上,C和C++是一样的。

3. 枚举

C++中的枚举与C中的也是一样的,使用关键字enum定义,气候是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表。枚举有如下特点:

  • 默认地,第一个枚举成员赋值为0,后面的每个枚举成员比前面的大1.
  • 枚举成员是常量,所以不能改变枚举成员的值。
  • 枚举成员值可以是不唯一的。
  • 每个enum都定义一种唯一的类型。所以枚举类型的对象的初始化或赋值,只能通过其枚举成员或统一枚举类型的其他对象来进行。

4. struct和class

在C++中用class和struct关键字定义类的唯一差别在于默认的访问级别:默认情况下,struct的成员为public,而class的成员为private。

5. 关于头文件

因为头文件包含在多个源文件中,所以头文件用于声明而不用于定义,即不应该包含变量或函数的定义。除下面三个例外

(1)定义类;

(2)定义inline函数(其实inline函数只应该定义在头文件中,不应该出现在源文件中);

(3)定义值在编译时就已经知道的const对象;

其实,上面三个例外项都有一个特点:可能会在很多地方使用,但每个地方(的定义)都是一样的,可以看成是其他地方(比如源文件中)的使用都是从定义它的头文件处获得的一个拷贝,不能修改。