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

6. 分段编译

Chapter4 Exercise 4-3

创建struct声明,且其在合适的“防护”头文件中声明,它有定义在一个cpp文件中的单个成员函数,main()在另一个文件中。

在这里插入图片描述

  • 在这个例子中,主函数在调用m.func()前,必须先编译Func.cpp
    若只编译main.cpp():

    g++ main.cpp -o main
    

    则会报如下的错:在这里插入图片描述
    正确的做法:

    g++ main.cpp Func.cpp -o main
    
  • 由此引出make: 管理分段编译

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值