c++ primer 笔记 (二)

第二章笔记  (貌似记得有点多)

 

把负值赋给unsigned对象时完全合法的,其结果是该负数对该类型的取值个数求模后的值   -1     (对265求模)  255
 
float型只能保证6位有效数字,而double型至少可以保证10位有效数字
 
定义长整形时,应该使用大写字母L。小写字母l很容易和数值1混淆
 
L‘a'在字符字面值前加L就能够得到wchar_t(扩张字符集,比如汉字和日语)类型的宽字符字面值
 
在一行的末尾加一反斜杠(\)符号可将此行和下一行当作同一行处理。
不允许\后面有注释或空格
 
本书,对象是内存中具有类型的区域。不管是内置类型还是类类型。
 
标识符不能包含两个连续的下划线__,也不能以下划线开头后面紧跟一个大写字母_A
 
*******初始化 != 赋值**************************
初始化:创建变量并给它赋初始值
赋值:擦除对象的当前值并用新值代替
 
直接初始化 int ival (1024);更灵活且效率高
复制初始化 int ival = 1024;
 
构造函数:定义如何进行初始化的成员函数
 
string all_nines(10,'9');//all_nines = "9999999999"
 
当定义没有初始化式的变量时,系统有时候会帮我们初始化变量。
系统提供什么样的值取决于变量的类型,也取决于变量的定义
 
内置类型变量在函数体外定义的变量都初始化成0,
在函数体里定义的内置类型变量不进行自动初始化。
 
永远不要依赖未定义行为
 
建议内置类型的对象都有初始化(容易、安全
 
类有默认构造函数,定义类变量时不用显式地初始化变量。
 
定义:用于为变量分配存储空间,还可以为变量指定初始值。变量有且仅有一个定义 int a = 1;
 
声明:用于向程序表明变量的类型和名字。 int a;
 
定义也是表明:当定义变量时我们表明了它的类型和名字
 
extern声明变量名而不定义它。(声明不是定义,不分配存储空间)
说明定义在程序的其他地方 extern int i;
 
*******程序中变量可以声明多次,但只能定义一次******
 
如果声明有初始化,那么它可被当作是定义
extern double pi = 3.1416 //definition
 
const把一个对象转换成一个常量
const int bufSize = 512;
常量在定义后就不能被修改,所以定义时必须初始化。
 
//file_1.cc
int counter;
//file_2.cc
extern int counter;
在全局作用域声明的const变量是定义该对象的文件的局部变量。
此变量只存在于那个文件中,不能被其他文件访问。
要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
//file_1.cc
extern const int buffer = 1024;
//file_2.cc
extern const int buffer;
 
引用(reference)就是对象的另一个名字(别名)。主要用作函数的形式参数。
复合类型(compound type)指用其他类型定义的类型。
不能定义引用类型的引用,但可以定义任何其他类型的引用。
int ival = 1024;
int &refVal = ival;//ok:refVal refers to ival
int &refVal2;       //error:a reference must be initialized
int &refVal3 = 10;//error:initializer must be an object
 
const引用
const int ival = 1024;
const int &refVal = ival;
 
int i = 42;
// legal for const references only
const int &r = 42;
const int &r2 = r + i;
同样的初始化对于非const引用是不合法的。
 
double dval = 3.14
const int &ri = dval;
        
        ↓
int temp = dval; // create temporary int from the double
const int &ri = temp; // bind ri to that temporary
 
const引用(只读)可以绑定到不同但相关的类型的对象或绑定到右值
 
typedef定义类型的同义词---------&定义变量的同义词
typedef double wages; // wages is a synonym for double
typedef wages salary;  // indirect synonym for double
 
enum指出  值是相关联的
// input is 0 ,output is 1,and append is 2
enum open_modes {input ,output,append};
 
不能改变枚举成员的值。枚举成员本身就是一个常量表达式
 
枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行
 
enum Points {point2d,point2w,point3d,point3w};
 
Points pt3d = point3d; //ok:point3d is a Points enumerator
Points pt2w = 3;        //error:pt2w initialized with int
pt2w = polygon;        //error:ploygon is not a Points enumerator
pt2w = pt3d             // ok:both are object of Points enum type
 
类(自定义类型)定义了该类型的对象包含的数据和该类型的对象可以执行的操作。
 
每个类都定义了一个接口(interface)和一个实现(implementation)
 
接口(先定义):由使用该类的代码需要执行的操作组成
实现:一般包括该类所需要的数据。还包括定义该类需要的但不提供一般性使用的函数。
定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。
 
成员 = 操作称为成员函数 + 数据称为数据成员
 
访问标号 public private
 
类不是在类定义里定义数据成员时初始化数据成员,而是通过构造函数的特殊成员函数控制初始化。
 
struct也可以定义类
用class 和 struct 定义类的唯一区别在于默认访问级别:
默认情况下,struct的成员为public
                而class的成为为private
 
编译头文件需要一定的时间---->>>>预编译头文件
 
头文件用于声明而不是用于定义
double fica_rate  // no extern ,so it's a definition
 
extern double fica_rate 声明
 
头文件不应该含有定义这一规则,有个例外
1.定义类
2.值在编译时就已知道的const对象
3.inline函数
 
const对象默认定义它的文件的局部变量
 
****当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。
 
当该const变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式来替换对这些const变量的使用。所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。
 
如果const变量不是用常量表达式初始化,应在头文件中为它添加extern声明,以使其能被多个文件共享。
 
 
#include 设施是C++预处理器(preprocessor)的一部分。
预处理器处理程序的源代码,在编译器之前运行
 
#include 指示只接受一个参数:头文件名。
预处理器用指定的头文件的内容替代每个#include
 
头文件保护符(header guard)避免在已经见到头文件的情况下重新处理该头文件的内容。
 
保证多次包含同一头文件不会引起该头文件定义的类或对象被多次定义。
 
#inndef  SALESITEM_H
#define  SALESITEM_H
// Definition of Sales_item class and related function goes here
#endif
 
头文件应该含有保护符,即使这些头文件不会被其他头文件包含。
 
可以用定义在头文件里的实体(如类)来命名预处理器变量来避免预处理器变量重名的问题。
 
<头文件> 标准头文件   编译器在预定义的位置集查找该头文件
“头文件” 非系统头文件  查找通常开始于源文件所在的路径 
posted @ 2015-01-12 16:11  胜强  阅读(172)  评论(0编辑  收藏  举报