数组的动态内存分配
假设我们要为一个字符数组(一个有 20 个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:
char* pvalue = NULL; // 初始化为 null 的指针pvalue = new char[20]; // 为变量请求内存
要删除我们刚才创建的数组,语句如下:
delete [] pvalue; // 删除 pvalue 所指向的数组
下面是 new 操作符的通用语法,可以为多维数组分配内存,如下所示:
int ROW = 2;int COL = 3;double **pvalue = new double* [ROW]; // 为行分配内存// 为列分配内存for(int i = 0; i < COL; i++) {
pvalue[i] = new double[COL];}
释放多维数组内存:
for(int i = 0; i < COL; i++) {
delete[] pvalue[i];}delete [] pvalue;
对象的动态内存分配
对象与简单的数据类型没有什么不同。例如,请看下面的代码,我们将使用一个对象数组来理清这一概念:
#include <iostream>using namespace std;class Box{
public:
Box() {
cout << "调用构造函数!" <<endl;
}
~Box() {
cout << "调用析构函数!" <<endl;
}};int main( ){
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // Delete array
return 0;}
如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
当上面的代码被编译和执行时,它会产生下列结果:
调用构造函数!调用构造函数!调用构造函数!调用构造函数!调用析构函数!调用析构函数!调用析构函数!调用析构函数!
函数宏
您可以使用 #define 来定义一个带有参数的宏,如下所示:
#include <iostream>using namespace std;#define MIN(a,b) (a<b ? a : b)int main (){
int i, j;
i = 100;
j = 30;
cout <<"较小的值为:" << MIN(i, j) << endl;
return 0;}
当上面的代码被编译和执行时,它会产生下列结果:
较小的值为:30
条件编译
有几个指令可以用来有选择地对部分程序源代码进行编译。这个过程被称为条件编译。
条件预处理器的结构与 if 选择结构很像。请看下面这段预处理器的代码:
#ifndef NULL #define NULL 0#endif
您可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:
#ifdef DEBUG cerr <<"Variable x = " << x << endl;#endif
如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译。您可以使用 #if 0 语句注释掉程序的一部分,如下所示:
#if 0 不进行编译的代码#endif
让我们尝试下面的实例:
#include <iostream>using namespace std;#define DEBUG#define MIN(a,b) (((a)<(b)) ? a : b)int main (){
int i, j;
i = 100;
j = 30;#ifdef DEBUG
cerr <<"Trace: Inside main function" << endl;#endif#if 0
/* 这是注释部分 */
cout << MKSTR(HELLO C++) << endl;#endif
cout <<"The minimum is " << MIN(i, j) << endl;#ifdef DEBUG
cerr <<"Trace: Coming out of main function" << endl;#endif
return 0;}
当上面的代码被编译和执行时,它会产生下列结果:
Trace: Inside main functionThe minimum is 30Trace: Coming out of main function