Thinking in C++--第四章 C++带给了我们什么?

Thinking in C++--第四章 C++带给了我们什么?
       为什么要用C++?效率?安全?可维护?
       提高效率,最好的方法是用别人的代码,即使用库。只需要导入一个.lib文件或者.dll文件和相应的.h文件你就可以用这个库中的接口了,这些接口的声明在.h文件中。如ZThread库,编译之后的库还需要导入你目前的工程中去。
       一个库通常从一组函数开始。
       所有语言的核心都是数据以及对数据的操作。在c中,处理相关联的数据的时候,就需要将数据组织成一个struct,然后操作这个struct。当操作的时候,我们面临两个问题:1. 每个函数必须包含这个struct对象的指针。2. 因为struct中的数据可以被其他程序随意改变。所以可不可以控制这种未知的风险呢?
      编译时,在栈上创建一个变量,则该变量的存储单元由编译器自动开辟和释放。编译器准确地知道需要多少存储容量,知道其变量的生命周期。而动态分配的内存,编译器不知道需要多少存储单元,不知道生命周期,也不能自动清除。
      在c中,在使用Struct时必须包含声明该结构体的头文件,不然,编译器不能正确地猜测这个结构像什么,但是它能猜测一个函数像什么。在头文件中声明是特别重要的,因为在包含头文件的任何地方,编译器准确地知道做什么。例如,如果在头文件中的一个声明是void func(float),编译器就知道,如果用一个整型参数调用这个函数,应该把这个参数转化为浮点型。如果没有声明,c编译器简单地假设有一个func(int)存在,它不会做转换。
      对于每个翻译单元,编译器创造一个目标文件。这些目标文件,连同必要的启动代码,由连接器连接为可执行程序。在连接过程中,应当确定所有的外部引用。当连接器将所有的目标文件放在一起时,它必须取未确定的外部引用,找出他们实际访问的地址。在执行过程中用这些地址替换这些外部引用。所以,早绑定发生在连接阶段。

     c语言中,使用库的最大障碍之一是名字冲突。编译器和连接器不允许出现两个名字相同的函数,解决的办法是在名字前面加点东西以区别不同的函数。
     迈向C++的第一步,把函数放在结构体中,用结构体限制函数名,相当于隐藏了名字。
     c和C++的不同:头文件中的声明是编译器要求的。
     抽象数据类型,又可以成为用户自定义类型。
头文件的重要性:
     头文件是我们和我们的库用户之间的合约。这份合约描述了我们的数据结构,为函数调用规定了参数和返回值,编译器需要这些信息以生成正确的代码。
     放什么到头文件中?只限于声明,不涉及分配存储的任何信息。
     多次声明的问题。
     编译器认为重声明结构体是一个错误。C++允许重声明函数。只要两个声明匹配即可。使用#pragma once 或者#ifndef #define #endif

你可能感兴趣的:(Thinking in C++--第四章 C++带给了我们什么?)