- 前言
- 一、C++是面向对象的
- 二、C++编译
- 三、C++命名空间
- 四、C++ Const
- 五、C++ new和delete
- 六、C++ 的内联函数
- 七、C++ 的重载
- 八、其他的细节
- 总结
前言
C++是由C语言发展而来的,C++拥有独立的编译器,在Linux环境下为g++,在g++ 4.8版本之后支持C++11,C++11又增加了许多新的特性,这些在后面的博客中说明,这里仅介绍C与C++的区别。
C++新增bool类型;
一、C++是面向对象的C++增加了class关键字用于定义类,同时也保留了C语言的struct关键字,相比于C语言,C++是面向对象编程的,对事物特征和变化规律的一种抽象并进行封装成类,可以包含成员变量和方法。C++的class和struct有微小的差异,主要是struct是public继承,private是私有继承,但是struct是可以使用模板参数,不能作为模板参数。C的话主要是面向算法和函数的。
二、C++编译C文件的后缀为.c,而C++的后缀比较混乱,有.cc、.cpp、.cxx等,一般我们都采用.cpp做后缀
c文件的编译使用gcc命令,C++文件的编译使用g++命令。
C文件编译 //编译单个文件 gcc a.c //编译单个文件 gcc a.c b.c C++文件编译 //编译单个文件 g++ a.cpp gcc a.cpp -lstdc++ //编译单个文件 g++ a.cpp b.c //使用-o选项可以指定可执行文件的名称: g++ a.cpp -o a //-E代表预处理 g++ a.cpp -E -o a.i //-S代表编译 g++ a.i -S -o a.s //-c代表汇编 g++ a.s -c -o a.o
C++编译流程:
- .cpp文件经过预处理器 编译成 .i文件。这个过程主要将头文件插入到程序文本中,并且进行宏替换。
- .i文件经过编译器 编译成.s文件。这个过程主要将高级语言编译成汇编语言。
- .s文件经过汇编器 编译成.o文件。这是一个二进制文件,即为可重定位的目标程序。
- .o文件经过了链接器 编译成.exe或者.out文件,是一个可执行程序,这个过程中将库文件、代码等链接在一起。
误区:
1、gcc 和 g++ 是等价的。.c文件 gcc 把他看作 c 程序,g++把他看成 c++程序;.cpp 文件两者都把他看成 c++ 程序
2、编译阶段,g++ 自动调用 gcc,两者相同。gcc 不能自动和 C++ 程序进行库链接,通常用 g++ 进行链接。gcc 可以通过 -lstdc++
命令将 C++ 程序与库文件链接。
3、__cplusplus是标识表示代码将按 C 还是 C++ 语法进行编译,.c文件且采用 gcc 编译,该则宏未定义,否则就已定义。
gcc编译器的命令:
| 命令 | 含义 |
|---|---|
| -E | 预处理,生成.i文件 |
| -S | 编译.s文件 |
| -c | 汇编,生成.o文件 |
| -o file1 file2 / file2 -o file1 | 生成名字为 file1 的可执行文件 |
| -I(大写字母 i ) directory | 指定 #include 包含的头文件的搜索目录 |
| -g | 编译时生成调试信息,该程序可以被调试器调试 |
| -D | 编译时指定一个宏 |
| -w | 不生成任何警告信息 |
| -Wall | 生成所有警告信息 |
| -On | n的取值范围为0-3,编译器的优化选项有4个级别,-O0代表没有优化,-O1为默认值(缺省值),-O3为最高级别 |
| -l(小写字母 L) | 指定程序在编译的时候使用的库 |
| -L | 指定程序在编译的时候使用的库,的搜索路径 |
| -fPIC/fpic | 生成与位置无关的代码 |
| -shared | 生成共享目标文件,通常用于建立共享库 |
| -std | 指定编译的标准,例如 C89、C99(C89要求所有变量定义在函数头部) |
| -shared | 生成动态库(共享库) |
C++引入了命名空间,一个最重要的体现就std命名空间,将C语言的函数和C++的函数进行了区分,例如c中的math.h
在C++中为cmath,带.h的头文件不在std空间中,也没必要在不同的命名空间,因为.h文件只是类的声明。C++可以定义自己的命名空间,使用时的命令为using namespace 名称;
namespace 名称{
变量;
方法;
类;
}
四、C++ Const
C++的const修改全局变量的作用域为本文件,使用extern命令也不生效,C为常量分配内存,可以通过指针修改其值,而C++不为基本类型常量分配内存,而是指向符号表,当使用(类型 *)强制类型转换时,会创建一个副本;
const int a=0; int *p=(int*)&a; *p=2; cout<<*p<<" "< 五、C++ new和deletenew的执行过程为两步:1、malloc分配空间,2、使用对象的构造函数对空间进行初始化,返回空间(堆)首地址,第一步出现异常,抛出std::bad_alloc异常,第二部出现异常,自动调用delete进行内存释放。
delete的执行也分为两步:1、使用对象的析构函数对对象进行析构;2、回收内存(free)为什么要在C语言 malloc和free 函数基础上增加 new和free 关键字:
六、C++ 的内联函数
1、malloc和free函数无法在对象创建和销毁时调用构造和析构函数
2、malloc和free时库函数,不是运算符,不在编译器控制权限,对象的构造和析构函数不能强加于malloc和free内联函数在编译时,是在调用处用函数体进行替换,不过几点需要注意:
七、C++ 的重载
1、类的函数默认就是内联函数,在声明处定义是无效的,不过可以在定义处定义
2、内联函数只是对编译器的建议,并不是强制的,编译器会自动判断是否进行替换
3、inline也有类型检查,更加安全相对于C而言,C++增加了重载,究其原因在于C++对函数编译时的命名规则和C 不同,例如A(int b,int c),在编译时,会被命名为_A_int_int,而C为_A
八、其他的细节C++增加了bool类型;
C++增加了默认参数,默认参数必须在形参后面;
C++增加了STL库;
C++增加了模板;
C++增加了虚函数。
总结如果有补充的请留言!!!一个 /(ㄒoㄒ)/~~ 的学生



