C和C++的区别

30 篇文章 1 订阅
16 篇文章 0 订阅

C和C++的区别:

目录

0,枚举

定义:

使用

1,扩展:双冒号作用域运算符

2,对全局变量检测增强

3,对函数的检测增强

4,类型检测增强

5,结构体struct相关


细说new与malloc的10点区别:https://mp.csdn.net/console/editor/html/104342587 

设计思想上:

C是面向过程的结构化编程语言,C++是面向对象的语言

语法上:

C++具有封装,继承,多态三种特征

C++相比C,增加了许多类型安全的功能,比如强制类型转换

C++支持范式变成,比如模板类,函数模板等

 

C++模板:

(1)可用来创建动态增长和减小的数据结构 (2)它是类型无关的,因此具有很高的可复用性。 (3)它在编译时而不是运行时检查数据类型,保证了类型安全 (4)它是平台无关的,可移植性 (5)可用于基本数据类型

0,枚举

以下部分内容摘自菜鸟教程 C++ 枚举类型详解 :https://www.runoob.com/w3cnote/cpp-enum-intro.html

C++提供了另外一种创建符号常量的方式,这种方式可以代替const。

它还允许定义新类型,但必须按严格的限制进行。

使用enum的句法与使用结构相似。

定义:

枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。

定义格式:枚举类型的定义格式为:

enum <类型名> {<枚举常量表>};

举例:

enum spectrum{red,orange,yellow,green,blue,violent,indigo,ultraviolet};

说明:

  • 关键字enum——指明其后的标识符是一个枚举类型的名字。
  • 枚举常量表——由枚举常量构成。"枚举常量"或称"枚举成员",是以标识符形式表示的整型量,表示枚举类型的取值。枚举常量表列出枚举类型的所有取值,各枚举常量之间以","间隔,且必须各不相同。取值类型与条件表达式相同。

 

枚举常量代表了枚举类型变量可能取到的值,每个枚举常量代表了一个整数值,这个整数就是该枚举常量在常量表中的序号值。

可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复

举例:

enum fruit_set {apple, orange, banana=1, peach, grape}
//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3。
enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6。

有赋值要求的枚举常量会是特定的值,其他值的赋值方式还是默认形式。

枚举常量只能以标识符形式表示,而不能是整型、字符型等文字常量。例如,以下定义非法:

enum letter_set {'a','d','F','s','T'}; //枚举常量不能是字符常量
enum year_set{2000,2001,2002,2003,2004,2005}; //枚举常量不能是整型常量

使用

可以一起定义,或者分开定义:

enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat} weekday1, weekday2;
enum Days{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
Dasy days1;

枚举变量的值只能取枚举常量表中所列的值,就是整型数的一个子集。

枚举变量占用内存的大小与整型数相同

枚举变量只能参与赋值关系运算以及输出操作,参与运算时用其本身的整数值。例如,设有定义:

enum color_set1 {RED, BLUE, WHITE, BLACK} color1, color2;
enum color_set2 { GREEN, RED, YELLOW, WHITE} color3, color4;
color3=RED;           //将枚举常量值赋给枚举变量
color4=color3;        //相同类型的枚举变量赋值,color4的值为RED
int  i=color3;        //将枚举变量赋给整型变量,i的值为1
int  j=GREEN;         //将枚举常量赋给整型变量,j的值为0

枚举变量可以直接输出,但不能直接输入

不能直接将常量赋给枚举变量

不同类型的枚举变量之间不能相互赋值

枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串;

枚举类型数据的其他处理也往往应用switch语句,以保证程序的合法性和可读性

 

同样:

枚举变量是全局变量的情况下, 枚举值的缺省值是0,不是枚举的第一个值。 其他情况,其值是不定的,而且不限定于所列出的枚举值。

 

 

1,扩展:双冒号作用域运算符

使用::跨过同名局部变量,直接访问全局变量

int atk = 200;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    test();
}
//双冒号作用域运算符
void MainWindow::test()
{
    int atk = 100;
    qDebug()<<"局部:"<<atk;
    qDebug()<<"全局:"<<::atk;

}
MainWindow::~MainWindow()
{
    delete ui;
}

2,对全局变量检测增强

int a;
int a = 10;

以上代码在C中不会报错,在C++中会报错。 

3,对函数的检测增强

int getRect(w,h)
{
}

以上代码在C中不会报错,在C++中会报错。

4,类型检测增强

C中存在自动转换,在C++中需要程序员手动转换。

5,结构体struct相关

在C++中,可以在结构体中增加函数

定义结构体对象也稍有不同

在C中,结构体只能定义变量,不能定义函数,可以定义函数指针

在C++结构体中,能定义函数,能够定义private、public、protected,可以从别的类继承,也可以被继承,可以有虚函数

C中声明结构体变量是struct Struct_Name a;//a是变量名 

而C++中直接使用Struct_Name a即可。

在使用关键字typedef则二者一样。

 

6,C++对const的增强

const修饰全局变量,无法被修改,在C/C++中一样,非常稳定。

但是对于局部变量,二者还是有区别的,C中可以通过指针修改局部变量的值,所以const在C中不稳定

 

在C++中,const很稳定

C++中,const修饰局部变量时,不会分配内存

int main(void)
{
    const int a = 10;
}

直接将变量放入符号表中,因为不会分配内存,所以无法修改。

                                           

    const int a = 10;
    int * p = (int *)&a;
    *p = 20;
    qDebug()<<"a"<<a;
    qDebug()<<"*p"<<*p;

          

可以看到,以上代码在C中,a的值会被修改,但是在C++中,a的值无法被修改

                

代码中修改的是P的值,不是a的值,a本身还在符号表中。

只要是初始化的时候分配了内存,不放在符号表里面,即可使用指针进行修改

用变量初始化const变量时,可以使用指针修改

//全局变量

//用变量初始化const变量
int a = 10;
const int b = a;//这个时候会分配内存
int * pp = (int *)&b;
*pp = 20;
qDebug()<<"b:"<<b;//局部定义b也是一样的

 

链接性的变化

C中:const修饰后,变量依旧是外部链接性。

C++中:const修饰后,变量为内部链接性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值