C语言与C++的区别一览

从C语言跳到C++之前,可以先看下本文,以了解C++在语法上的变化!只描述C++基础部分,不涉及C++标准库,类设计者的工具及其他高级主题等部分。

1.头文件的区别

C++的头文件是#include <iostreams>;

2.命名空间

例如,一个名为 fun() 的函数,在另一个可用的库中也存在一个相同的函数 fun()。这样,编译器就无法判断您所使用的是哪一个 fun() 函数。因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间作用在于控制标识符的作用域。

using namespace std;//一般用这个
std::cout//在输出的时候前面加上std::
using std::cout;

3.输入,输出

输出:预定义的对象 cout  iostream 类的一个实例。cout 是与流插入运算符 << 结合使用的,如下所示:

cout << "Hello World! " << endl;

输入:预定义的对象 cin  iostream 类的一个实例。cin 是与流提取运算符 >> 结合使用的,如下所示:

cin>>i ;

4.数据类型

布尔型

Booltrue/fause

浮点型

float

字符型

char

双浮点型

double

整型

int

无类型

void

六种数据类型再通过signedunsignedshortlong种修饰符,可实现数据范围的控制。

typed声明:为一个已有类型重新声明一个名字,例如:typedef int feet;

枚举类型(enumeration)C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。

创建枚举,需要使用关键字 enum。枚举类型的一般形式为:

enum color { red, green=5, blue } c;
c = red;

blue6;默认情况下,每个名称都会比它前面一个名称大 1,但 c 的值依然为 0

5.结构体

C语言结构体引用前需要加struct,如果不想加,则在定义的时候,可在struct前加typedef。而C++定义的时候不需要struct

C语言中结构体不能定义函数,而C++中结构体元素可以调用函数;

6.函数默认值

C++中我们在定义或声明一个函数的时候,有时会在形参中给它赋一个初始值作为不传参数时候的缺省值,例如:

int funint a = 10);代表没有传参调用的时候,自动给a赋一个10的初始值。然而这种操作在c语言下这么写就会报错。

我们都知道,系统在调用任何一个函数的时候都有函数栈帧的开辟,如果函数有参数则需要压入实参。平常在我们人为给定实参的时候,是按照参数列表从右向左依次将参数通过

mov  eax/ecx   dword ptr[ebp-4]       //假设是int数据

指令传入寄存器,再通过push指令压入。现在我们已经给定了函数参数的默认值,那么在压实参的时候只需要一步push初始值即可。效率更高。

另外需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。

有了函数默认,调用的时候就不需要传参,当然也支持用户自定义实参,那样的话,形参中的默认就将被覆盖

自定义实参的时候,必须按照左实参,右默认的顺序,即只能省略尾部的实参,因此在调用的时候,就要合理的设置形参的顺序,尽量让不怎么使用默认值的形参出现在前面。

在默认实参初始值的问题上,局部变量不能使用默认实参。

string wd=80;
char def =’‘ ‘;
string screen (sz=wd,char=def);  //函数声明

void main()
{
def=’’*’;//改变了默认实参的值
string wd =100;//定义了局部变量,但是并没有改变默认值
window=screen()//调用screen(80,’*’);
}

7.强制转换(显式转换)

C语言就是

int a=100;

float b=(float)a;//(目标类型)表达式

C++形式:cast-name<type>(expression)

cast-namestatic_castdynamic_castconst_castreinterpret_cast中的一种;

type:目标转换类型;expression是要转化的值

static_cast:只要不包含底层的const都可以使用static_cast

const_cast:只针对改变运算对象的底层const 

8.条件运算符

if else可以在C++中用三目运算符,但运算的结果是一个变量,a或者b

a>b?a:b;

C++中可以将上式放在左边,然后进行赋值;

而在C语言中,三目运算符运算的结果是一个值,就不能放在等号左边。

9.引用

引用为对象起了另一个名字

int i = 17;

int&  r = i;//必须立马等于i

10.内联函数

只有当函数只有 10 行甚至更少时才将其定义为内联函数.

定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.

内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).

有些函数即使声明为内联的也不一定会被编译器内联, 只是建议

内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中,include之后就可以使用,

含递归的不能为内联函数;循环语句、switch语句不使用内联;在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符;

内联函数要在函数被调用之前声明。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

//函数一开始没有被声明为inline:
void f();
//然后就有代码调用它:
f();
//在调用后才有定义函数为inline:
inline void f()
{
......
}

11.函数重载

C++ 允许在同一作用域中的某个函数指定多个定义,称为函数重载。

同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。具体的程序网上均有。

想具体了解可以去网上检索,都很多,这里只做简单介绍。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值