第二章
1.关于什么是对象? 一般而言,对象就是内存中具有类型的区域,说的具体一点,就是计算左值表达式就会产生对象。
2.关于初始化,分为直接初始化(direct-initialization)和复制初始化(copy-initialization),直接初始化是把初始化式放在括号里,复制初始化语法用等号(=):
如: int ival(1024); //direct_initialization
int ival=1024; // copy-initialization;
此外,初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新的值替代。
3.变量的初始化规则:内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。
4.const对象默认为文件的局部变量,与其他变量不同,除非特别声明,在全局作用于声明的const变量是定义该对象的文件的局部变量,此变量只存在那个文件中,不能被其他文件访问。
5.引用:引用是一种复合类型,通过在变量名前面天劫“&”符号来定义。在引用的情况下,每一种引用类型都“关联到”某一其他类型,不能定义引用类型的引用,但可以定义任何其他类型 的引用。
引用必须用于该引用同类型 的对象初始化。
int ival=1024;
int &refVal=ival; //OK
int &refVal2; //error: a reference must be initialized
int &refVal3=10 //error: initializer must be an object
引用是别名,它是绑定对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用的对象上。
当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象上。
const 引用是指向const对象的引用
const int ival=1024;
cosnt int &refVal=ival; //OK
int &ref2=ival; //error: nonconst reference to a const obeject
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定都右值。
6.,枚举:枚举的定义包括关键字enum,其后是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表。
如: enum open_modes(input,output,append);
不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于常量表达式能用的任何地方。
枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
如: open_modes om1=input;
open_modes om2=2; //error: om2 initialized with int
om1=point; //error: point is not a open_modes enumerator
om2=output; //OK.
7.头文件:a:头文件用于声明而不是定义
头文件可以定义类,值在编译时就已经知道的const对象和inline对象。
b: 一些const对象定义在头文件中
c++中的任何变量都只能定义一次,定义会分批存储空间,而所有对该变量的使用都关联到同一存储空间。当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。当该const变量使用常量表达式初始化时,可以保证所有的变量都有相同的值,但是在实践中,大部分的编译器都会用相应的常量表达式来替换对这些const变量的使用,所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。
第四章 数组和指针
1.数组
非const常量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
字符串字面值包含一个额外的空字符(NULL)用于结束字符串
char c1[]={'c','+','+'}; //no null
char c2[]={'c','+','+','\0'}; //explicit null
char c3[]="c++"; //null terminator add automatically
数组不允许直接赋值和复制。
用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t.
2.指针
许多有用的程序都不可使用数组或者指针实现,现代c++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格字符串。
指针初始化和赋值操作的约束
a 0值常量表达式,例如,在编译时课获得0值整型const对象或字面值常量0
b 类型匹配的对象的地址
c 另一对象之后的下一地址
d 同类型的另一个有效指针
int ival;
int zero=0;
const int c_ival=0;
int *pi=ival; //error: pi initialized from int value of ival
pi=zero; //error: pi assigned int value of zero
pi=c_ival; //ok: c_ival is a const with compile-time value of 0
pi=0; //ok: directly initialize to literal constant 0
关于void*指针
C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址,void*指针只支持几种优先的操作:
与另一个指针进行比较:向函数传递void*指针赋值。不允许使用void*指针操纵它所指向的对象。
关于指针和const限定符
把一个const对象的地址赋给一个普通的,非const对象的指针也会导致编译时的错误。
不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址。
如果只向const的指针所指的对象并非const,则可直接给对象赋值或者间接地利用普通的非const指针修改其值,毕竟这个值不是const,重要的是要记住,不能保证指向const的指针所指的值一定不可修改。
关于指针和typedef
typedef string *pstring;
const pstring cstr;
等价于
string *const cstr;
3.动态创建数组
每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或者堆(heap),C语言使用malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。
可以在数组的长度后面加一堆空圆括号,对数组元素做值初始化。
int *pia=new int[10](); //array of 10 initialized ints, 本例中个元素都为0
关于const对象的动态数组。
const int *p=new const int[100]; //error:uninitialized const array
const int *p=new const int[100](); //ok:value-initialized const array
关于新旧代码的兼容: 可以使用C风格字符串对string对象进行初始化或者赋值
string类型的加法操作需要2个操作数,可以使用C风格字符串作为其中的一个操作数,也允许将C风格字符串用作符合赋值操作的右操作数。
c_str函数返回C风格字符串,其字面意思是:“返回C风格字符串的表示方法”。
第五章 表达式
1.new和delete表达式
int *p=new int; //p points to an uninitialzed int
int *p=new int(); //p points to an int value_initialized to 0
值初始化的()必须置于类型名的后面,而不是变量后,例如:
int x(); //does not value initialze x
这个语句声明了一个名为x,没有参数返回int值的函数
如果指针指向的不是用new分配的内存地址,则在该指针上使用delete是不合法的。
一旦删除了指针所指向的对象,立即将指针置为0,这样就可以非常清楚的表明指针不再指向该对象。