1、域(scope)就是用来区分名字含义的一般上下文(context)。
2、名字解析(name resolution)的过程就是把表达式中的一个名字域某一个声明相关联的过程,也是给出这个名字意思的过程。
3、因为名字解析期间查找域的顺序由内向外,所以在外围域中的声明被嵌套域中的同名声明所隐藏。
4、关键字extern为声明但不定义一个对象提供了一种方法。它类似于函数声明,承诺了该对象会在其他地方被定义,或者在此文本文件中的其他地方,或者在程序的其他文本文件中。如:
extern int i;
既指定了关键字extern,又指定了一个显式初始值的全局对象声明将被视为为该对象的定义。
5、符号常量可以在同一程序的不同文件中被定义多次。
6、未初始化的自动对象包含一个随机的位模式,是该存储区上次被使用的结果,它的值被称为未定义的(unspecified)。
7、new表达式调用库操作符new(),delete表达式调用库操作符delete()。
8、如果指针操作数被设置为0,则C++会保证delete表达式不会调用操作符delete()。
9、动态分配的数组第一维不必是常量。
10、用new表达式在空闲存储区内创建一个const对象:
const int *pci = new const int( 1024 );
11、要使用定位new表达式(placement new expression),需包含头文件 。这项设施允许程序员分配大量的内存,供以后通过这种形式的new表达式创建对象。如:
TestClass *pb = new ( buf ) TestClass;
//do something else
delete [] buf;
其中buf在之前被定义过,比如:
char *buf = new char[ 5120 ];
在使用delete时,不是
delete pb;
而必须是
delete [] buf;
12、名字空间并没有消除全局名字空间污染(glocal namespace pollution)问题,但是它大大缓解了这个问题。
13、::member_name指向全局名字空间的成员member_name。
14、只有包围成员声明的名字空间(该成员所在的名字空间及其外围名字空间)才可能包含它的定义。只有一个名字空间成员在名字空间定义中已经声明过,它才能在该名字空间定义之外被定义。当名字空间成员在名字空间外被定义时,名字空间名和函数的返回值必须被限定修饰。
15、未命名的名字空间的定义局部于一个特定的文件。
16、简化名字空间成员的用法:名字空间别名(namespace alias)、using声明、using指示符。
17、using声明引入的名字空间有以下特性:
- 它在该域中唯一
- 由外围域中的声明引入的相同名字被其隐藏
- 它被嵌套域中的相同名字的声明隐藏
18、using指示符使名字空间成员可见,就好像它们是在名字空间被定义的地方之外被声明的一样。
19、使用using声明而不是using指示符可以更好的控制全局名字空间污染问题。