1.动态存储分配
- 一旦分配了新内存块,旧内存块中的数据必须拷贝进这个新内存块,并释放旧内存块。
-
- 任何由new分配的内存块必须由delete释放,否则会造成内存泄漏。
2.基本对象
- 作用域解析运算符( :: )
这样命名是因为名字现在能在不同的范围内:在全局范围或在一个struct的范围内。例如Stash::initialize(int size)表示initialize()属于stash - void*:C++允许将任何类型的指针赋给void*
3.预处理器指示#define、#ifdef和#endif
- #define FLAG 简单定义,不指定值
- #ifdef FLAG #endif //FLAG
二者成对出现,#endif之后无注释是不合规定的
#ifndef HEADER_FLAG
#define HEADER_FLAG
//Type declaration here...
#endif //HEADER_FLAG
- #undef:它将使得使用相同变量的**#ifdef**语句得到假值,同时引起预处理器停止使用宏
- #ifndef:如果标记还没有定义,它得到真值
4.嵌套结构
#ifndef STACK_H
#define STACK_H
struct Stack {
struct Link {
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
}*head;
void initialize();
void push(void* dat);
void* pop();
void cleanup();
};
#endif //STACK_H
5.全局作用域解析
编译器默认选择“最接近”的成员名字,若程序并不是使用“最接近”的成员名字,则使用作用域解析运算符。当我们要用作用域解析运算符指定一个全局名字时,在运算符前面不加任何东西。
下面是显示变量和函数的全局作用域解析的例子
int a;
void f();
struct S{
int a;
void f();
};
void S::f() {
::f(); //Select the global f()
::a++; //Select the global a
a--; //The a at struct scope
}
int main() {
S s;
f();
}