C与C++的区别

C与C++的区别与联系 本篇博客对C与C++的区别与联系进行了整理。并对一些小的知识点进行了扩展。 首先我们先来看一看C/C++的联系 C/C++的联系:   C是C++的子集,C++兼容大部分的C语言的语法结构 C/C++的区别:   我们都知道C是面向过程的语言,而C++是面向对象的语言。那这里我们就要知道什么是面向对象?       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过... 阅读详情

1 C与C++设计区别

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理(标准C中无此功能)等等,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和容器等等。 在C++中,数据封装、类型这些是最基本的,需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等等问题。

2 语言上的变化

2.1 register变量

对于C而言不能通过&取地址符获得register变量的地址,但在C++中是可以的

//C++代码
register int a = 2;
cout << "&a = " << &a << endl;//OK

//C代码
register int a = 2;
printf("&a = %d\n", &a);//error

2.2 局部变量定义位置

C++中局部变量可以在程序块内任何地方定义,但是C语言中局部变量必须在程序块的开头定义(后来的C中取消了此限制,也可以在程序块的任何地方定义)

2.3 函数参数为空

在C++中func()等价于func(void),但是在C中func()既可以认为其有一个或多个参数,也可认为其没有参数,func(void)是表明没有参数的,如下代码:

//C++代码
#include <iostream>

using namespace std;

int func()
{
    cout << "func()" << endl;
}

int main()
{
    func();//正确
    func(1);//错误
    func('c');//错误
    func(1,"dlkf");//错误 

    return 0;
}

//C 代码
#include <stdio.h>

int func()
{
    printf("func()\n");
}

int main()
{
    func();//正确
    func(1);//正确
    func('c');//正确
    func(1,"dlkf");//正确 

    return 0;
}

2.4 字符常数

    //C代码
    int a = "12";    //OK
    printf("a = %d\n", a);

    //C++代码
    int a = "123";    //error

C语言中字符常数被当做整型处理(并不是指他所表示的整型),但C++中不行。

2.5 多次定义全局变量

int g;
int g;

以上代码在C中是可以接受的,但在C++中会报错(以上g为全局变量)

2.6 struct

struct myStruct
{
public:
    void setX(int t)
    {
        x = t;
    }
    int getX()
    {
        return x;
    }
private:
    int x;
};

以上定义在C++中是可以的,在C中是不行的。
结构体是C的一部分,C++从C中继承了结构,在语法上,类与结构十分相似,在关系上,这两者也很接近,在C++中,结构的作用被拓宽了,进而使结构成为了类的一种替代方法.实际上,类与结构的惟一区别在于:在默认状态下,结构的所有成员均是公有的,而类的所有成员是私有的.除此之外,类与结构是等价的,也就是说,一个结构定义了一个类的类型. C++同时包含这两个等价的关键字struct与class基于3个方面的原因.第一,加强结构的能力.在C中,结构提供了一种数据分组方法,因而让结构包含成员函数是一个小小的改进.第二,由于类与结构是相互关联的,所有现有C代码到C++的移植变得更容易.第三,由于类与结构的等价性,提供两个不同的关键字可以使类定义自由发展,为了保持C++与C的兼容性,结构定义必须始终受它的C定义的结束.

2.7 union

union myUnion
{
public:
    void setX(int t)
    {
        x = t;
    }
    int getX()
    {
        return x;
    }
private:
    int x;
    double y;
};

以上代码在C++中可以,但在C中是不可以的

联合也可以用来定义类.在C++中,联合包含成员函数,变量以及构造与析构函数.C++联合保留了C联合的全部特征,其中最重要的特征是所有数据元素共享内存的相同地址.与结构体类似,联合的成员在默认状态下也是公有的,并且完全兼容于C.与结构一样,C++中的联合声明定义了一种特殊的类,进而意味着保持了类的封装原则.
C++的联合有几个必须遵守的使用限制.
(1)联合不能继承其他任何类型的类.
(2)联合不能是基类,不能包含有虚函数成员.静态变量不能是联合的成员.联合不能使用引用成员,而且不能有任何作为成员的重载赋值运算符的对象.(3)如果一个对象包含明确的构造或析构函数,该对象不能成为联合的成员.

C++有一个叫做匿名联合的特殊联合.匿名联合没有类型名,也不声明任何变量,只是告诉编译程序它的成员变量共享一个内存地址.但是,变量本身无需要使用常规的点运算符语法即可直接引用.上述联合的使用限制也适用于匿名联合,但下面这两个限制除外,第一,匿名联合所包含的元素只能是数据,不能包含成员函数,也不能包含私有或受保护元素;第二,全局匿名联合必须声明成静态的.
注:以上struct和union部分参考了(尚有部分不是很理解具体用时回看)http://blog.youkuaiyun.com/wqvbjhc/article/details/4107268

2.8 引用类型(别名)

    int x = 2;
    int& y = x;

在C++中y相当于x的别名,但是在C中没有这种表示会报错

2.9 异常处理

C++中加入try,catch异常处理机制,C中没有相应的机制。

2.10 内存操作

(1)malloc/free是C/C++的标准库函数,new/delete是C++的运算符
(2)malloc分配内存时需要指定大小(字节数),而new可以自动分配空间大小。
(3)new时做两件事,一是为分配内存空间,二是为分配的内存调用一个或多个构造函数构造对象;delete时也做两件事,一是调用一个或多个析构函数析构对象,二是释放内存空间。

C++引入new/delete的原因:
对于用户自定义对象,在对象创建时需要自动执行构造函数,在销毁之前需要自动执行析构函数,malloc/free是库函数不再编译器的控制权限之内,不能动态的管理对象,因此引入new/delete,new对对象完成动态内存分配和初始化,delete对对象完成清理和释放内存。

2.11 #define与inline, const

(1)#define宏定义是C中语法,它仅是进行简单的替换,不做安全性检查(比如参数类型,语法完整性等);inline是在编译时在调用点之间吧inline函数代码嵌入目标程序中,相比于普通函数少了中断调用速度更快,但是目标代码体积变大,inline具有安全性检查(比如参数类型,语法完整性等)。
(2)比如#define LEN 1+2,在代码中遇到LEN只是简单的用1+2替换掉LEN,看如下代码:

#include <iostream>

using namespace std;

#define TESTDEFINE1(x)   x*x

inline int testInline1(int x)
{
    return x*x;
}

#define TESTDEFINE2(x)   ((x)*(x))

int main()
{
    cout << "*******************test1**********************" << endl;
    cout << TESTDEFINE1(1+2) << endl;
    cout << testInline1(1+2) << endl;

    cout << endl;
    cout << "*******************test2**********************" << endl;
    int x = 1;
    cout << TESTDEFINE1(x++) << endl;
    cout << "After TESTDEFINE1 x = " << x << endl;
    int y = 1;
    cout << testInline1(y++) << endl;
    cout << "After testInline1 y = " << y << endl;
    int z = 1;
    cout << TESTDEFINE2(z++) << endl;
    cout << "After TESTDEFINE2 z = " << z << endl;

    return 0;
}

运行结果:
**************test1*****************
5
9

**************test2*****************
1
After TESTDEFINE1 x = 3
1
After testInline1 y = 2
1
After TESTDEFINE2 z = 3

(3)是否在调用点插入inline代码由编译器决定,编译器有权拒绝,inline函数体积一般比较小且被频繁调用。define与inline代码都在预编译器符号表中。
(4)定义常量尽量使用const代替#define定义的常量,因为#define没有类型检查等安全性检查,比如以下代码:

#define LEN1 1+2
const int LEN2 = 1+2;

cout << "LEN1*LEN1 = " << LEN1*LEN1 << endl; //输出5
cout << "LEN2*LEN2 = " << LEN2*LEN2 << endl; //输出9

(5)const, define定义常量的好处
a. 见名知义,比如以上LNE1,LEN2知道它们表示长度,而不是无意义的数字
b. 修改方便,若程序中多次使用到一个常量,我们若要修改其值只需修改一处
c. 提高运行效率,对于define使用预编译器进行的简单替换,不需要为常量分配空间,因此执行速度更快(const定义的常量,有的在符号表中,有的要分配空间)。

详解C与C++的联系与区别 C++与C的联系: C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让 阅读详情

相关推荐

“C语言与C++的七大区别 - 了解C语言与C++ cpp的差异“

而在C语言中,同样可以使用头文件来包含函数声明,但是C++中的头文件需要注意与C语言中的头文件区分开来。在C++中,我们可以通过定义类来描述一个对象的属性和方法,从而封装数据和行为。而在C语言中,没有类的概念,我们只能通过结构体来封装数据,没有对方法的支持。例如,在C++中,我们可以重载"+"操作符,使其能够执行字符串的拼接操作,这与C语言不同。而在C语言中,只有手动内存管理,需要使用malloc和free函数来进行内存管理。在C语言中,函数名必须唯一,无法定义同名函数,因此在C语言中不能进行函数重载。

DevForge的博客 401

c++函数

文章目录参数基本类型引用类型指针类型类类型数组类型可变参数默认值函数参数内联函数常量函数函数指针 参数 基本类型 void func_name(int); void func_name(float); void func_name(double); void func_name(char); void func_name(const int); void func_name(const float); void func_name(const double); void func_name(const ch

巅峰状态 386

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2882

C和C++区别

C和C++的区别 首先我们先简单介绍一下C语言和C++: ①:C语言的介绍 C语言是一个结构化语言,它的重点在于算法和数据结构。C语言的设计首要考虑的是如果通过一个过程对输入进行运算处理得到输出。 C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。 C语言是非常有效率的,作为一个底层编译语言,可以通过指针直接去对内存进行管理,另外很多语言都是用C语言来设计的,如java,python。 ②:C++的介绍 C++是对C语言的继承与发展,C++功能很强大,可以应用开发大型应用软件。即可以面

weixin_45009662的博客 5863

PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)

本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。

weixin_33686714的博客 318

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 455

C++与C语言的区别

本文主要用C语言和C++做对比来学习C++,便于个人理解。C++包含C语言,是对C语言的扩展,在C++中,支持C语言的语法使用,C++是C语言的超集。

2301_78622258的博客 8282

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1017

C和C++的区别?

C语言 C++

xingc77的博客 1万+

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

平衡小车动力学建模

两轮自平衡小车由车体和双轮两部分组成,可以看成一个移动的倒立摆,分别对车轮和车体进行力学分析,建立动力学模型,最后,通过对两者的分析给出系统的状态空间表达式。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjiPEUVJ-1679470559950)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20230322110521545.png)]

qq_23096319的博客 9056

C语言和C+的区别是什么?8个点通俗易懂的告诉你!

有些初学的同学傻傻分不清其中的区别,下面我将详细的讲解C语言和C++的区别点帮助大家尽快的理解。(但是呢,C语言和C++可是有着密不可分的关系哦,一般学习其中一种都会需要学习另一种!) 1、关键字 蓝色标注为C语言关键字,C++继承了C语言的所有关键字,以下红色标注为C++中 含有但C语言没有的...

HUYA69的博客 4656

48、住宅抵押贷款支持证券的定价、风险评估与结构化设计

本文深入探讨了住宅抵押贷款支持证券(RMBS)的定价、风险评估与结构化设计。内容涵盖提高定价准确性的方差缩减方法,如准蒙特卡罗序列的应用;分析RMBS面临的利率风险、信用风险和模型风险,并提出相应的度量与应对策略;介绍利用动态规划优化CMO分层结构以最大化发行利润的方法。同时总结了RMBS的基本类型、定价流程及市场发展趋势,为投资者和发行人提供全面的决策支持。

quiet的专栏 156

c++语言程序的后缀,c++中后缀名.c 与.cpp的区别?

ITMISS二者区别如下:.c 是c语言的源程序,.cpp是c++语言的源程序,这是两种不同的语言,语法不同。但是c++兼容c语言的绝大部分语法特性,所以该段代码在C++中可以运行,但是在C语言中就会报错。想要在C中运行,可以将定义变量放置在函数开头,修改后程序段如下:#includevoid main(){int a;a=7;float x,y,z;x=2.5;y=4.7;z=x+a...

weixin_34766614的博客 3278

在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统

智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。

xiaoheshang_123的博客 140

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CPP笔记 第一章 C与C++区别

<>代表的是所有的系统级的文件,而非自己的。 自己的文件引用为“”,如“SSSS.H”

qq_33229537的博客 797

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

详解.c与.cpp 的区别

说起c和cpp的区别,我想大部分学计算机的都说不全,这次我就给大家好好总结一下。一、带默认值的函数   带默认值的函数,顾名思义就是函数形参中带有默认值,比如下面这段c++代码, 123456789 #includeint sum(int a = 10,int b = 20){    return a+b;}int main(){    return 0;它的函数形参a和被赋予了10和20,这段代...

century_sunshine的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

重读《C++ Primer Plus》笔记 之 C++与C的区别

无参方法中使用void在C中,空的参数列表表示方法可以接受任意数量的参数;而使用void则表示不能接受任何参数;在C++中,空参数列表表示方法不能接受任何参数;两者的差异在编译阶段体现:如下例,// Program 1 (Compiles and runs fine in C, but not in C++) void fun() { } int main(void) { fun(10...

myco前的专栏 1966

c语言中.cpp英文全称,请问在c++中后缀名.c 与.cpp的区别?

qq_遁去的一_1二者区别如下:.c 是c语言的源程序,.cpp是c++语言的源程序,这是两种不同的语言,语法不同。但是c++兼容c语言的绝大部分语法特性,所以该段代码在C++中可以运行,但是在C语言中就会报错。想要在C中运行,可以将定义变量放置在函数开头,修改后程序段如下:#includevoid main(){int a;a=7;float x,y,z;x=2.5;y=4.7;z=x+...

weixin_34884417的博客 2733

c程序设计语言cpp,c++中后缀名.c 与.cpp的区别?

二者区别如下:.c 是c语言的源程序,.cpp是c++语言的源程序,这是两种不同的语言,语法不同。但是c++兼容c语言的绝大部分语法特性,所以该段代码在C++中可以运行,但是在C语言中就会报错。想要在C中运行,可以将定义变量放置在函数开头,修改后程序段如下:#includevoid main(){int a;a=7;float x,y,z;x=2.5;y=4.7;z=x+a%3*(int)(x...

weixin_42382748的博客 3656

.c与.cpp的区别解析

这几天在练习数据结构等知识的时候,有时遇见文件保存为c后缀则能编译通过,有时又是保存cpp后缀才能通过。对于这个都没能区分清,是自己的基本功问题,于是百度了一下。幸好有许多和我一样有问题的人。   其实简单来说,cpp就是编译c++文件,支持c++语法,而c就是编译c语言文件,支持c语言。2者的区别就在于语法和编译时的确别吧。   当然,对于类的引用和某些函数都是应该区别对待的。具体的内容可以...

小白的逆袭 3万+

C++与C区别

C++中的string对象与C语言中的字符数组的区别: 主要区别:可以将string对象声明为简单变量,而不是数组,如string str1 = "panther" 使用string类时,某些操作比使用数组更简单。 例如,不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象。 string str1; string str2 = "panther"; str...

编程爱好者的博客 4347

终于有一篇文章可以把C 与 C++ 的区别说清楚了

在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。C和C++的主要区别是,C++支持许多附加特性。但是,C++中有许多规则与C稍有不同。这些不同使得C程序作为C++程序编译时可能以不同的方式运行或根本不能运行。本节着重讨论这些区别。如果使用C++的编译器编译C程序,就知道这些不同之处。虽然C和C++的区别对本书的示例影响很小,但如果把C代码作为C++程序编译的话,会导致产生错误的消息。 C99标准的发布使得问题更加复杂,因为有些情况下使得C更接近C++。例如,C99标准允许

人邮异步社区 5718

Object-C 与C/C++的区别

1)Object C 的类只能继承一个类,不能继承多个类,如果要实现类似多个继承,需要使用Category和Extension, Extension是没有名字的Category,也就是匿名Category。 2)Object C从2011年引入了Automatic Reference Counting (ARC),支持垃圾收集,不需要担心内存泄露的问题;而C++依然不支持,需要自己手工管理内存...

jimmyleeee的专栏 7695

CPP-基础:C/C++数组名与指针的区别

2005-08-23 08:36 来源:天极网 作者:宋宝华 责任编辑:方舟·yesky 引言   指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/...

dixiongbi7761的博客 196
上一篇: 字符串Hash函数
下一篇: UDP协议
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值