c/c++拾遗(二)

来源:互联网 发布:spark python 教程 编辑:程序博客网 时间:2024/05/18 11:27

1,在标准C语言中,const符号常量默认是外连接的,不能在两个编译单元中定义一个同名的const符号常量。
但是在标准c++中,const默认是内连接的,可以在两个编译单元中定义一个同名的const符号常量,编译器认为它们是不同的符

合常量,因此每个编译单元独立分配存储空间,在链接时进行常量合并。
2,一个多维数组在语义上并不等价于一个指向其元素类型的指针,相反它等价于一个“指向数组的指针”。
例如:
int *p = new int [3][5];//不合法
int (*p)[5] = new int [3][5];//合法
同样的道理,在删除动态创建的数组时,
delete [][]p;//不合法
delete []p;//合法
3,引用与指针的区别
(1)引用在创建时必须初始化
(2)不存在NULL的引用,引用必须与合法的内存单元关联,所以不能用字面常量来初始化引用。
例如:
const int a = 6;
int &b = a;//g++编译不通过
(3)引用一旦被初始化为一个对象,就不能改变为对另一个对象的引用。
例如:
int a=10,b=100;
int &r =a;
r=b;//并不是让r引用b,而是改变a的值为b.
(4)引用的创建和销毁不会调用构造和析构函数。
4,字面常量和符号常量
(1)字面常量
例如:
x=-100.24f;
#define A 0x0001;
char *ps = "aaa";
……
这些都是字面常量,不能修改。编译器一般把它们保存在程序的符号表而不是一般的数据区中。符号表是只读的部分在ELF

(linux中)文件中。
(2)符号常量
在C语言中,用const定义的常量值不能修改,编译器会为他们分配存储空间;但是在c++中,const变量的情况根据实际而定:
对基本的数据类型(int,double,char等),编译器会把他们放在符号表二不分配空间,而对自定义数据类型的const对象则需

要分配存储空间。
另外,还有一些其他情况会为const分配存储空间,例如,强制申明为extern的符号常量,对符号常量取地址操作等。
例如:对const常量取地址情况,
const int a = 10;
int *p= (int *)a;//编译器此时为a的副本分配存储空间,并将a值保存在分配的空间中
*p = 100;//改变a值的副本,a本身的值并没有改变(a本身存在于符号表中)。
上述情况不同于自定义的数据类型(通过指针会修改const的对象,因为编译器为自定义对象分配了空间)。
5,不要定义超越“类型最大位数”的位域成员。例如:
struct
{
 unsigned int year : 33;//位越界,不合法
};
6,可以定义长度为0的位域成员,其作用是迫使下一个成员从一个完整的"机器字(word)"开始分配空间。
struct S1
{
  char a;
  unsigned int b : 5;
}s1;
sizeof(s1) = 4;
struct S2
{
  char a;
  unsigned int :0;//长度为0的位域成员
  unsigned int b : 5;
}s2;
sizeof(s2) = 8;
7,建议:设计位域时,最好不要让一个位域成员跨域一个不完整的字节来存放,这样会增加计算机的开销。
8,关于联合数据类型union:联合中用一个成员存入数据而用另一个成员来提取它是可以的,但是结果可能不是我们想要的;
在定义联合的时候可以指定初始值,而且该初始值必须与联合的第一个成员的类型匹配。可以取一个联合变量的地址,也可以

取一个联合变量任一个成员的地址,他们都是相等的。
9,联合的另一用处是来解析一个寄存器或者多字节内存变量的高低字节的值,例如:
union U
{
 short a;
 char b[2];
}u;
u.a = 0x4142;
在一个小端字节序的平台上,则b[0]保存了a的低字节'B',b[1]保存了高字节‘A’。
10,枚举变量和常量都可以参与整型变量能参加的某些运算,但不能给枚举变量赋予一个不在枚举常量列表中的值。不要对枚

举变量使用++,--,+=等操作,除非重载了这些运算符。此外,可以定义匿名枚举来定义程序中出现的相关常量集合,用于代

替宏常量和const常量。
enum e
{
 A=5,
 B=6//枚举常量
};
e w = A;//w为枚举变量

原创粉丝点击