C语言与C++的区别

2023-05-16

一、C++简介

    本贾尼·斯特劳斯特鲁普,于1979年4月在贝尔实验室负责分析UNIX系统的内核的流量情况,于1979年10月开始着手开发一种新的编程语言,

    在C语言的基础上增加了面向对象机制,这就是C++的来历,在1983年完成了C++的第一个版本


 

    C++与C的重要区别:

        1、C++完全兼容C的所有内容

        2、C++支持面向对象的编程思想和机制

        3、C++支持运算符重载、函数重载等编译时多态机制

        4、C++支持泛型编程、模板机制

        5、C++支持异常处理

        6、C++的类型检查更严格

    注意:学习C++的重点是学习面向对象这种编程思想,而不是花里胡哨的语法

二、C++的第一个程序

#include <iostream>

using namespace std;

int main(int argc,const char* argv[])

{

    cout << "Hello Would!" << endl;

    return 0

}

    1、文件的扩展名由 .c 变成.cpp .cc .C .cxx

    2、编译器由gcc变成g++、但gcc也可以继续编译c++文件,需要增加参数  -xC++ -lstdc++

    3、C++的标准库头文件不带.h  iostream 意为in out stream  在C++中输入、输出被封装流操作,C语言中的头文件还可以继续使用,

    但是建议在C标准头文件前加 c 并去掉 .h , 因为这样的头文件中删除了大量不使用的宏,并重新添加到名字空间中,防止在C++中命名

    冲突

    4、输入输出

        cout 用于输出

        cin  用于输入

        不再需要占位符,会自动识别数据类型

        printf/scanf 是C语言标准库函数

        cout/cin 是C++标准库中类对象

        endl 负责换行

    5、增加了名字空间机制,是C++为了解决命名冲突而发明的一项机制

三、C++与C数据类型的不同点

    1、结构的不同

        a、不再需要 typedef 关键字进行省略 struct ,只需在设计好结构后, 定义结构变量时不再需要struct关键字

        b、结构中的结构成员可以是成员变量还可以是成员函数,结构变量、结构指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接

        访问本结构的其他成员变量、成员函数、不再需要 . ->

        c、结构中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数)

        d、可以给结构成员设置访问属性

            public      公开的 (默认)

            protected   保护的  

            private     私有的

        e、结构是可以继承其他结构,也可以被其他结构继承

   

    2、联合的不同

        a、不再需要 typedef  关键字进行省略  union  ,只需在设计好结构后, 定义结构变量时不再需要 union 关键字

        b、联合中的成员可以是成员变量还可以是成员函数,联合变量、联合指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接

        访问本联合的其他成员变量、成员函数、不再需要 . ->

        c、联合中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数)

        d、可以给结构成员设置访问属性

            public      公开的 (默认)

            protected   保护的  

            private     私有的

        e、联合不能继承

    3、枚举的不同

        a、不再需要 typedef 关键字进行省略 enum ,在设计好枚举后,定义枚举变量时不再需要enum关键字

        b、是一种独立的数据类型,不能与整型进行自动隐式转换

    4、bool类型的不同

        a、C++中有真正的布尔类型,bool 是C++的关键字,不需要包含stdbool.h,可直接使用

        b、true 、false 也是C++中的关键字,但在C语言中都不是

        c、true 、false 在C++中是1字节,而在C中是4字节

        注意:无论是C还是C++中bool类型都是1字节,且只存储 0|1

    5、字符串的不同

        a、C++中的字符串封装成了string类,但还可以使用C中的字符串,且能与string进行相互转换

        b、string类型被封装在string头文件,但已经被包含到iostream中,属于std名字空间

        c、可以使用string字符串成员函数,还可以使用运算符的方式操作string类,但是C语言中的 string.h 系列函数还可以继续使用

            =   strcpy

            +=  strcat

            ==  strcmp

            .size() strlen

            .c_str()    由string转换为char*

        d、C++中没有规定string必须以'\0'为结束标志,编译器可能在末尾加,也可能不加,由编译器决定,因为他的长度信息封装到类的私有

        成员中

   

    6、 void* 的不同

        在C语言中,void*可以与任何类型的指针进行相互转换;在C++中,void* 不可以自动转换成其他类型的指针,如果需要赋值给其他类型

        的指针时,只能强制类型转换后才能赋值,为了提高指针访问内存的安全性考虑

        但是其他类型的指针依然可以自动转换成 void* 类型指针,C++之所以保留该功能,是因为C语言标准库、操作系统接口函数采用了

        大量的 void* 作为函数,如果不保留该功能,那么C++在调用这些函数时会非常麻烦(mmap/bzero/memcpy/memcmp...)

   

四、名字空间

        1、为什么需要名字空间

        C++完全兼容C语言,C标准库中自带了大量的类名、函数名、变量名,所以全局的标识符大量增加,容易导致全局的标识符命名冲突的风险

        也大大增加

        2、什么是名字空间

        是C++中增加的一种对命名空间进行逻辑划分单元的技术,称为名字空间,是一种解决命名冲突的机制

        namespace xxx{

            变量名;

            函数名;

            结构、联合、枚举;

            类;...

        }    

        定义出来xxx名字空间形成了一个封闭的作用域

        3、如何使用

            a、直接全部导入

                using namespace xxx;

                这样在后续代码中直接使用xxx名字空间中的所有内容,虽然很方便,但是不建议这样用

            b、域限定符

                xxx::标识符名

                单次访问名字空间中的标识符

        4、名字空间合并

            同名名字空间可以多次定义,不同位置的同名名字空间会自动合并

            a.cpp

            namespace n1{

                xxx

            }

            b.cpp

            namespace n1{

                yyy

            }

            main.cpp

            using namespace n1;//会把a.cpp的xxx和b.cpp的yyy全部导入



 

        5、声明和定义可以分开

            a.h

            namespace n1{

                extern int num; // 声明

            }

            a.cpp

            int n1::num = 88;   // 定义

            但是注意要加域限定符

        6、匿名名字空间

            所有的全局标识符都归属同一个名字空间,它没有名字,称为匿名名字空间,如果没有指定名字空间名,其实默认使用的是匿名名字

            空间

            匿名名字空间中的成员可以使用 ::标识符 来访问

            所以:同名局部变量屏蔽全局变量时,可以使用 ::变量名来指定访问匿名名字空间的全局变量

        7、名字空间可以嵌套

                namespace n1{

                    int num = 10;

                    namespace n2{

                        int num = 20;

                        namespace n3{

                            int num = 30;

                        }

                    }

                }

            采用逐层分解的方式:

            n1::n2::n3::num

            也可以直接导入指定的名字空间

            using namespace n1::n2;

        8、给名字空间取别名

            namespace n123 = n1::n2::n3;

   

    五、C++的堆内存管理

        1、C++中有专门管理堆内存的语句,而C语言只能使用标准库中的函数malloc/free     C++  new/delete (语句)

            new         分配堆内存  相当于C语言中的malloc

            delete      释放堆内存  相当于C语言中的free

            常用格式: 类型* p = new 类型;

                      int* p = new int;

        2、new分配内存时可以直接对内存进行初始化

            类型*p = new类型(val);

        3、new/delete 不能与malloc/free 混合使用  

            int* p = new int;

            free(p); //语法支持,不应该这样使用

            使用new分配内存时会自动调用结构、联合、类类型的构造函数,而使用delete会自动调用这些类型的析构函数,但是malloc/free

            并不会调用构造、析构函数

        4、数组的分配和释放

            类型* p = new 类型[数量];

            相当于分配连续的多块相同类型的内存,类似于C中的calloc

            delete[] 专门用于释放通过new[]方式所申请的内存,并且它会自动多次调用析构函数

            注意: new/delete     malloc/free  new[]/delete[]   必须不能混用

                如果使用new[]为结构、联合、类申请到的内存前4个字节记录了申请的次数,这样的目的是为了让编译器在delete[]知道

                应该调用的多少次析构函数

        5、重复释放

            delete 和 free一样,都可以释放空指针,但是都不能重复释放相同内存

        6、内存分配失败

            malloc分配失败则返回NULL

            new 分配失败,则会抛出一个异常std::bad_array_new_length

        7、new 和 malloc 返回值不同

            malloc成功返回void*

            new 成功返回有类型的指针

            #include <iostream>

            #include <cstdlib>

            using namespace std;

            struct Student

            {

                Student()

                {

                    cout << "我是Student的构造函数" << endl;  

                }

                ~Student()

                {

                    cout << "我是Student的析构函数" << endl;  

                }

            };

            int main(int argc,const char* argv[])

            {

                Student* stu = new Student[3];

                int* p = (int*)stu;

                cout << p[-1] << endl;

            //  free(stu);

                delete[] stu;

                int* p1 = new int[167];

                cout << p1[-1] << endl;

                delete[] p1;

                /*

                int* p = new int(1234);

            //  *p = 100;

                cout << *p << endl;

            //  delete p;

                free(p);

                */

            }

    重点掌握:   malloc/free  和  new/delete 的区别

    身份:       函数                运算符\关键字

    返回值:     void*               带类型的指针

    参数:      字节个数(手动计算)     类型  自动计算字节数            

    处理数组:手动计算数组总字节数      new 类型[数量]

    扩容:       realloc                 不好直接处理

    失败:       返回NULL                抛异常并结束

    构造\析构:  不调用                  自动调用

    初始化:     不能初始化              new 类型(val)

    头文件:     stdlib.h               直接使用

    重载:       不允许重载                允许

    分配内存位置:堆内存                 自由存储区

    注意:自由存储区只是一个抽象的概念,如果new底层默认调用malloc,此时分配的是堆内存,但是new可以当做运算符被程序员重载

    或者new(地址)类型的方式分配内存时,可能会被分配到其他任意的区域,取决于括号内的地址是哪个段

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言与C++的区别 的相关文章

随机推荐

  • Linux操作系统基本代码

    1 xff08 ls xff09 list 列出目录的所有项 ls 查看当前目录 xff08 ls l 文件路径 xff09 以详细模式查看 xff08 ls xff5e xff09 展示主目录文件 xff08 ls xff09 展示当前目
  • C语言 const、static、volatile等关键字的作用

    目录 前言 const static volatile extern 总结 前言 C语言里面有许多关键字 xff0c 本文结合我自己的了解简单讲讲几个常用关键字的作用 const 问 xff1a const有什么用 xff1f 答 xff1
  • 函数调用,中断以及进程切换,的现场保护的区别

    注意以下过程描述了两种armv7指令集的内核的中断表现 xff08 cortex A7和cortex m3 xff09 xff0c 但是cortex A7和cortex m3表现很不一样 xff0c 因为Cortex m3只有用户级和特权级
  • Cortex-M3 PendSV 中断 系统调用 说明

    参考 Cortex M3权威指南中文版 PendSV异常是和系统调用有些类似 xff0c cpu 需要手动将往NVIC 的PendSV 悬起寄存器中写1 xff0c 然后产生中断 xff0c 系统调用 xff08 SVC xff09 是co
  • 微积分的直观理解

    在微积分中 xff0c 我们进行定积分计算的时候一般是用牛顿莱布尼兹公式 xff0c 不定积分计算也类似 xff0c 都需要寻找原函数F x xff0c 但是如果想直观的理解微积分 xff0c 我们需要顺着公式的反方向进行理解 xff0c
  • Makefile中调用make命令,-C和-f选项的区别

    C选项 Makefile中 C是递归调用子目录中的Makefile xff0c C选项后跟目录 xff0c 表示到子目录下执行子目录的Makefile xff0c 顶层Makefile中的export的变量还有make默认的变量是可以传递给
  • 卡尔曼滤波

    标准卡尔曼滤波推导相关 预测 predict 更新 update 注意 xff0c 以下对于时间的下标 xff0c 有的时候用t有的时候用k xff0c 它们其实是一样的 xff0c 因为参考不同的资料 xff0c 所以写的比较乱 其中是隐
  • EM算法原理

    Notion The all in one workspace for your notes tasks wikis and databases
  • Android ko module compile 简介

    Notion The all in one workspace for your notes tasks wikis and databases
  • volatile c语言关键字 / cache / 内存一致性

    Notion The all in one workspace for your notes tasks wikis and databases
  • Qt中的QWidget::move函数

    QWidget move函数 原型 xff1a void move int x int y void move const QPoint amp 其中move的原点是父窗口的左上角 xff0c 如果没有父窗口 xff0c 则桌面即为父窗口
  • 欧拉角和万向节死锁

    一 什么是欧拉角 欧拉角就是物体绕坐标系三个坐标轴 xff08 x xff0c y xff0c z轴 xff09 的旋转角度 xff0c 在这里坐标系可以是世界坐标系 xff0c 也可以是物体坐标系 xff0c 旋转顺序也是任意的 xff0
  • 【freeRTOS内存管理策略详解】

    内存管理对应用程序和操作系统来说都非常重要 现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关 FreeRTOS操作系统将内核与内存管理分开实现 xff0c 操作系统内核仅规定了必要的内存管理函数原型 xff0c 而不关心这些内存管理函数
  • NGFF、M.2、PCIe、NVMe概念区分以及PCIEx1 x4 x8 x16区别

    对于NGFF M 2 PCIe NVMe等概念的说明 解决方案 NGFF Next Generation Form Factor xff0c 顾名思义 xff0c 是物理外形 Form Factor 的标准 与 NGFF 并列的是 2 5
  • 二重积分和雅可比行列式

    我们以二重积分为例进行说明 xff0c 首先说结论 xff1a 一 结论 若x 61 x u v y 61 y u v 存在偏导数 xff0c 则二阶雅可比行列式为 61 61 dxdy 61 J2 dudv J2的绝对值 且 其中积分区域
  • 雅可比行列式和雅可比矩阵

    接触雅可比行列式是在二重积分的变量变换中 xff0c 参见我的另一篇文章https blog csdn net xiaoyink article details 88432372 下面我们来详细说明一下雅可比行列式和雅可比矩阵 雅可比矩阵
  • jlink-v8 固件修复

    一 先说 jlink v8 v9 v10区别 v8基本价格在40左右 xff0c 芯片是atml的 xff0c 但是很多反应是掉固件和提示盗版问题 v9现在主流 xff0c 盗版价100左右 xff0c 主控芯片stm32 做的比较成熟 x
  • kubernetes学习-快速上手速查手册

    目录 使用k3s快速搭建k8s安装k8s dashboard使用Helm部署K8S资源k8s核心命令一切推倒重来资源创建方式NamespacePodDeploymentServiceIngress解决官网Ingress安装不了问题使用方式
  • 作为一个4年程序员至少需要掌握的专业技能

    一名3年工作经验的程序员应该具备的技能 xff0c 在机缘巧合之中 xff0c 看了这篇博客 感觉自己真的是很差 xff0c 一直想着会写if else 就已经是一名程序员了 xff0c 在工作之余也很少学习 于是 xff0c 自己的cod
  • C语言与C++的区别

    一 C 43 43 简介 本贾尼 斯特劳斯特鲁普 于1979年4月在贝尔实验室负责分析UNIX系统的内核的流量情况 于1979年10月开始着手开发一种新的编程语言 在C语言的基础上增加了面向对象机制 这就是C 43 43 的来历 在1983