侯捷 C++ 学习路径:面向对象的高级编程 -> STL库 -> C++11新特性 -> cmake
1.1. C 与 C++的区别
在C语言中,主要存在两大类内容,数据和处理数据的函数,二者彼此分离,是多对多的关系。不同的函数可以调用同一个数据,这就导致在开发大型项目的时候,二者纠缠在一起,容易出现问题。
因此推出,面向对象的C++语言,用类将函数和数据进行封装,使得数据只能被某些特定的函数进行处理,效果上类似结构体struct,很好的将数据与函数的多对多关系转变为一对一关系,避免了很多程序错误。
虽然C语言中的 struct 确实可以用来创建复杂的数据类型并在一定程度上模拟面向对象编程(OOP)的思想,但与C++中的 class 相比,C语言的 struct 仍然存在一些重要的限制和区别,这也是为什么C++引入了面向对象的编程概念。以下是一些关键点:
总的来说,虽然在C语言中可以通过 struct 和函数指针等技巧模拟一些面向对象的概念,但C++通过 class 提供了更加完善和直接的支持,使得面向对象编程更加自然和高效。因此,引入C++及其面向对象特性能够大幅简化代码的组织和管理,提升代码的可维护性和扩展性。
1.2. 头文件的防御式声明
在写头文件中代码是,为了避免调用头文件的主文件每次运行都重新读取一遍头文件中的内容,降低程序运行效率,需要我们在头文件中进行防御式声明,如下所示,其中COMPLEX
是我们自己定义的名称,用于区分不同的头文件:
#ifndef __COMPLEX__
#define __COMPLEX__
...
#endif
如此一来,主程序只会在第一次调用头文件时读取头文件的完整内容,避免了反复读取重复内容的操作
1.3. 头文件的布局
#ifndef __COMPLEX__
#define __COMPLEX__
// 前置声明
#include <cmath>
class ostream;
class complex;
complex&
__doapl (complex8* this, const complex& r);
// 类的声明
class complex
{
...
};
// 类的定义
complex::function ...
#endif
1.4. inline(内联)函数
简单来讲,定义为 inline 的函数运行效率更高,但即使你将所有的函数都定义为 inline 函数,也不能保证程序的效率会更好,这是因为一个函数最终是否成为 inline 函数,是由编译器决定的,你的 inline 关键字只是建议。函数若在 class body 内完成定义,便自动成为 inline 的“候选人”。
class complex
{
public:
complex(double r=0,doublei=0)
: re(r),im(i)
{}
complex& operator += (const complex&);
double real () const { return re; }
double imag () const { return im; }
private:
double re,im;
friend complex& __doapl(complex*, const complex&);
};
inline double
imag(const complex& x)
{
return x.image();
}