C++对C的增强

来源:互联网 发布:python opencv cuda 编辑:程序博客网 时间:2024/05/20 18:41

1、全局变量检测增强

例如:int a=10;//赋值,当做定义

    int a;//没有赋值,当做声明

    int main()

{

printf("a:%d\n",a);

return EXIT_SUCCESS;

}

上述代码在C++下编译失败,在C下编译通过。

2、C++中所有的变量和函数都必须有类型

例如:

//i没有写类型,可以是任意类型

int fun1(i){

printf("%d\n", i);

return 0;

}

//i没有写类型,可以是任意类型

int fun2(i){

printf("%s\n", i);

return 0;

}

//没有写参数,代表可以传任何类型的实参

 int fun3(){ 

printf("fun33333333333333333\n");

return 0;

}

//C语言,如果函数没有参数,建议写void,代表没有参数

int fun4(void){

printf("fun4444444444444\n");

return 0;

}

 

g(){

return 10;

}

 

int main(){

fun1(10);

fun2("abc");

fun3(1, 2, "abc");

printf("g = %d\n", g());

return 0;

}

以上c代码c编译器编译可通过,c++编译器无法编译通过。

C语言中,int fun() 表示返回值为int,接受任意参数的函数,int fun(void) 表示返回值为int的无参函数。

C++ 中,int fun() 和int fun(void) 具有相同的意义,都表示返回值为int的无参函数。

3、类型转换更加严格

C++,不同类型的变量一般是不能直接赋值的,需要相应的强转

例如:

typedef enum COLOR{ GREEN, RED, YELLOW} color;

int main(){

color mycolor= GREEN;

mycolor= 10;

printf("mycolor:%d\n", mycolor);

char* p= malloc(10);

return EXIT_SUCCESS;

}

以上c代码c编译器编译可通过,c++编译器无法编译通过

4、struct类型的增强

1)c中定义结构体变量需要加上struct关键字,c++不需要。

2)c中的结构体只能定义成员变量,不能定义成员函数。c++即可以定义成员变量,也可以定义成员函数。

如:

//1. 结构体中即可以定义成员变量,也可以定义成员函数

struct Student{

string mName;

int mAge;

void setName(string name){mName = name; }

void setAge(int age){mAge = age; }

void showStudent(){

cout << "Name:" << mName<< " Age:" << mAge<< endl;

}

};

 

//2. c++中定义结构体变量不需要加struct关键字

void test01(){

Student student;

student.setName("John");

student.setAge(20);

student.showStudent();

}

5、新增bool类型

标准c++的bool类型有两种内建的常量true(转换为整数1)和false(转换为整数0)表示状态。这三个名字都是关键字。

1) bool类型只有两个值,true(1值),false(0值)

2) bool类型占1个字节大小

3) bool类型赋值时,非0值会自动转换为true(1),0值会自动转换false(0)

例:

void test()

{ cout <<sizeof(false) <<endl; //1//bool类型占一个字节大小

bool flag =true; // c语言中没有这种类型

flag = 100;//bool类型赋值时,非0值会自动转换为true(1),0值会自动转换false(0)

}

[c语言中的bool类型]

c语言中也有bool类型,在c99标准之前是没有bool关键字,c99标准已经有bool类型,包含头文件stdbool.h,就可以使用和c++一样的bool类型

6、三目运算符功能增强

1)c语言三目运算表达式返回值为数据值,为右值,不能赋值

例:

int a= 10;

int b = 20;

printf("ret:%d\n", a> b ? a: b);

//思考一个问题,(a > b ? a : b)三目运算表达式返回的是什么?

//(a > b ? a : b) = 100;

//返回的是右值

2)c++语言三目运算表达式返回值为变量本身(引用),为左值,可以赋值

例:

int a= 10;

int b = 20;

printf("ret:%d\n", a> b ? a: b);

//思考一个问题,(a > b ? a : b)三目运算表达式返回的是什么?

cout << "b:" << b<< endl;

//返回的是左值,变量的引用

(a > b? a : b) = 100;//返回的是左值,变量的引用

cout << "b:" << b<< endl;

7、const增强

C语言中const是伪常量,可以通过指针修改

C++中const会放入到符号表中

C语言中const默认是外部链接,C++const默认是内部链接

const分配内存情况

对变量取地址,会分配临时内存

extern关键字下的const会分配内存

用普通变量初始化const变量

自定义数据类型会分配内存

尽量用const代替define

define宏没有作用域概念

define宏常量没有类型