高质量程序设计指南C/C++语言——C++/C程序设计入门

时间:2023-12-27 11:45:25

1、在C++/C中,全局变量(extern或static)存放在程序的静态数据区中,在程序进入main()之前创建,在main()结束之后销毁,因此在我们的代码中根本没有机会初始化它们,于是语言及其实现就提供了一个默认的全局初始化器0。如果你没有明确地给全局变量提供初值,编译器就会自动地将0转换为所需要的类型来初始化它们。函数内的static局部变量和类的static数据成员都具有static存储类型,因此最终被移到程序的静态数据区中,也会被默认初始化为0,除非你明确地提供了初值。但是自动变量的初始化则是程序员的责任,因为它们是运行时在堆栈上创建的并且可以在运行时由程序员来初始化的,不要指望编译器会给它一个默认的初值。

2、要区分初始化和赋值的不同。前者发生在对象(变量)创建的同时,而后者是在对象创建后进行的。

3、全局变量的初始化、数据类型的隐式转换、类的隐含成员的初始化等都是编译器的责任,而局部变量的初始化、强制类型转换、类的非静态数据成员的初始化等都是程序员的责任。

高质量程序设计指南C/C++语言——C++/C程序设计入门

4、“编译时”起作用:

  预编译伪指令、类(型)定义、外部对象声明、函数原型、标识符、各种修饰符号(const、static等)及类成员的访问说明符(public、private、protected)和连接规范、调用规范等仅在编译器进行语法检查、语义检查和生成目标文件(.obj或.o文件)及连接时起作用的,在可执行程序中不存在这些东西。

5、“运行时”起作用:

容器越界访问、虚函数动态决议、函数动态连接、动态内存分配、异常处理和RTTI等则是在运行时才会出现和发挥作用的。

高质量程序设计指南C/C++语言——C++/C程序设计入门

6、标准C语言支持的基本(内建)数据类型有int、long、float、double、char、void以及它们和signed、unsigned、*、&等的组合。标准C++在这些类型的基础上增加了bool类型,并同时增加了两个内置的符号常量true、false(关键字)。

7、void是“空”类型(无值型),意思这种类型的大小无法确定。显然不能声明void类型的对象或是将sizeof()运算符用于void类型,C++/C不能对一个大小未知的对象直接操作。

8、某些基于RISC(精简指令集计算机)的CPU,对内存中基本数据类型的变量采用高字节(BYTE)和高字(WORD)在低地址存放的Big Endian存储格式,并且把最高字节的地址作为变量的首地址。在这种自然的存储格式中,要求变量在内存中的存放位置必须自然对齐,否则CPU会报告异常。

9、Intel系列的CPU采用Little Endian存储格式来存放基本类型变量,即低字节和低字在低地址存放,并且把最低字节的地址作为变量的首地址。在Intel系列CPU这种硬件平台上,不要求基本类型变量在内存中必须自然对齐。如果变量没有自然对齐,可能会在一定程度上降低CPU访问该变量的性能,但不会影响程序的正确性。

10、一个低级数据类型对象总是优先转换为能够容纳得下它的最大值的、占用内存最少的高级类型对象。例如100(类型为int)如果转换成long型就能满足编译器的要求,那就不会转成double型。高质量程序设计指南C/C++语言——C++/C程序设计入门

11、标准C语言允许任何非void类型指针和void类型指针之间进行直接的相互转换。但在C++中,可以把任何类型的指针直接指派给void类型指针,但不能反过来将void类型指针直接指派给任何非void类型指针,除非进行强制转换。因此,在C语言环境中我们就可以先把一种具体类型的指针如int *转换为void *类型,再把void *类型转换为double *类型,而编译器不会认为是错误的。这样的做法存在着不易察觉的安全问题(内存扩张和截断等),这是标准C的一个缺陷。