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++编译流程:

  1. .cpp文件经过预处理器 编译成 .i文件。这个过程主要将头文件插入到程序文本中,并且进行宏替换。
  2. .i文件经过编译器 编译成.s文件。这个过程主要将高级语言编译成汇编语言。
  3. .s文件经过汇编器 编译成.o文件。这是一个二进制文件,即为可重定位的目标程序。
  4. .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生成所有警告信息
-Onn的取值范围为0-3,编译器的优化选项有4个级别,-O0代表没有优化,-O1为默认值(缺省值),-O3为最高级别
-l(小写字母 L)指定程序在编译的时候使用的库
-L指定程序在编译的时候使用的库,的搜索路径
-fPIC/fpic生成与位置无关的代码
-shared生成共享目标文件,通常用于建立共享库
-std指定编译的标准,例如 C89、C99(C89要求所有变量定义在函数头部)
-shared生成动态库(共享库)

三、C++命名空间

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<<" "<<a; //2 0

五、C++ new和delete

new的执行过程为两步:1、malloc分配空间,2、使用对象的构造函数对空间进行初始化,返回空间(堆)首地址,第一步出现异常,抛出std::bad_alloc异常,第二部出现异常,自动调用delete进行内存释放。
delete的执行也分为两步:1、使用对象的析构函数对对象进行析构;2、回收内存(free)

为什么要在C语言 malloc和free 函数基础上增加 new和free 关键字:
1、malloc和free函数无法在对象创建和销毁时调用构造和析构函数
2、malloc和free时库函数,不是运算符,不在编译器控制权限,对象的构造和析构函数不能强加于malloc和free

六、C++ 的内联函数

内联函数在编译时,是在调用处用函数体进行替换,不过几点需要注意:
1、类的函数默认就是内联函数,在声明处定义是无效的,不过可以在定义处定义
2、内联函数只是对编译器的建议,并不是强制的,编译器会自动判断是否进行替换
3、inline也有类型检查,更加安全

七、C++ 的重载

相对于C而言,C++增加了重载,究其原因在于C++对函数编译时的命名规则和C 不同,例如A(int b,int c),在编译时,会被命名为_A_int_int,而C为_A

八、其他的细节

C++增加了bool类型;
C++增加了默认参数,默认参数必须在形参后面;
C++增加了STL库;
C++增加了模板;
C++增加了虚函数。


总结

如果有补充的请留言!!!一个 /(ㄒoㄒ)/~~ 的学生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值