C和C++的区别:
目录
细说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修饰后,变量为内部链接性。