Thinking in C++【3】数据抽象

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();
}

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/112278841