C++回顾之C与C++区别_00

来源:互联网 发布:js array 添加数据 编辑:程序博客网 时间:2024/06/08 03:39

对阶段性笔记进行整理,以便简单回顾

C++与C的几大区别

1.类型检查更严格

const int a;//c语言中编译可以通过,c++中不可以通过
int const a;//两个一样的

char *p = malloc(100); //c中可以编译可以通过,c++中不可以通过

2.内置bool类型

C语言直到C99标准才增加了对布尔类型的支持,关键字为_Bool,因为bool已经被C++用了,所以选了这个十分奇怪的关键字。

bool:C++内置对布尔类型的支持,其关键字是bool。布尔型,一般1个字节;取值false和true,是0和1的区别。c++编译器将会在赋值时将非0值转换为true,0转换为false.
BOOL: int型,据编译环境决定,一般4个字节

3.增加枚举类型

c语言没有真正的枚举类型,例子:
enum DAY today;
today = 100; //c中可以通过,枚举本身应为常量

SEASON s;
s = 100; //C++中不可以通过

4.表达式可以被赋值

int a,b = 10;
(a = b) = 10; //表达式是不可以被赋值的 c中不可以 c++中可以
(a !=b?a:b) = 1000; // c中不可以 c++中可以

a = b =10; //c中可以 c++中不可以

5.cin cout与scanf printf

两者相同功能,但是前者为对象,后者为函数
char name[30];
scanf(“%s”, name);//不安全 容易越界导致崩溃
cin>>name; //流输入运算符 针对键盘输入流

cout<<”name =“ << name << endl; //先把name=流到cout里,再把那么流到cout里,最后end1流到cout;

6.String灵活强大

7.namesapace

C中的命名空间

在c语言中只有一个全局作用域
c语言中所有的全局标示符共享同一个作用域
标示符可能冲突

C++中的命名空间

命名空间将全局作用域分成不同的部分
不同空间中的标示符可以相同而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间

8.register关键字增强

register关键字请求编译器将局部变量存储于寄存器中

c语言中无法取得register变量地址
c++中可以取得register变量地址,且c++编译器有自己的优化方式,不使用register也可能做优化

早期c语言编译器不会对代码进行优化,因此register对变量的声明变得无效
c++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效

9.struct类型加强

c语言的struct定义了一组变量的集合,c编译器并不认为这是一种新的类型
c++中的struct是一个新类型的定义声明

10.c++中对所有的变量和函数都必须有类型

c++中所有的变量和函数都必须有类型
c语言中的默认类型在c++中是不合法的

11.const

c语言中的const**变量**是只读变量,有自己的存储空间
c++中的const**常量**,修饰的常量在编译期间就确定下来
可能分配存储空间,也可能不分配存储空间
当const常量为全局时,并且需要在其它文件中使用,会分配存储空间。
当使用&操作符取const常量的地址,会分配存储空间
当const int &a = 10;const修饰引用时,也会分配存储空间

const和#define的区别

c++中的const常量类似于宏定义
const int c = 5; 类似 #define c 5
c++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

12.引用

1)引用在c++的内部实现是一个常指针
Type &name <–> Type* const name
2)c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的内存空间大小于指针相同
3)从使用的角度,引用会让人误认为其只是一个别名,没有自己的存储空间,这是c++为了实用性而做出的细节隐藏
void fun(int &a )——–void fun(int *const a)
{ ————————— {
a = 5; ———————- *a = 5;
} ————————— }
4)仔细对比间接赋值成立的三个条件

定义两个变量(一个实参,一个形参)建立关联,实参取地址传递给形参*p去间接的修改实参的值

引用在实现上只不过是把间接赋值的后两个条件合和二为一
(当实参传给形参引用时,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针))

引用当左值(c++引用使用时的难点)

当函数返回值是引用时

若返回栈变量,不能成为其他引用的初始值,不能作为左值使用若返回静态变量或者全局变量,可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用
0 0
原创粉丝点击