C++相比于C语言增加的8个小特性(详解)

C++相比于C语言增加的8个小特性(详解)

C++相比于C语言增加的8个小特性(详解)

文章目录

C++相比于C语言增加的8个小特性(详解)一、命名空间二、C++输入和输出三、缺省参数四、函数重载五、引用六、内联函数七、auto关键字八、指针空值nullptr总结

一、命名空间

c++的命名空间是为了弥补C语言的坑,比如我们定义一个变量:rand,就会出现以下问题! c++调整这一缺点,来进行调整,引用了关键字:namespace

使用方式如下(示例):

#include

#include

namespace ming

{

int rand = 0;

}

int main()

{

printf("%p\n", rand);

printf("%p\n", ming::rand);

return 0;

}

命名空间定义和使用 1.命名空间里面也可以嵌套使用 ! 2.如果在同一个工程中,命名空间名字相同,则编译器自动合成为同一个命名空间。 如果想方便一点,可以直接 using namespace std 直接声明即可! 3.项目中,尽量不要使用using namespace std。 4.日常练习用using namespace std 5.项目和指定命名空间访问+展开常用

二、C++输入和输出

由于C语言中scanf 和 printf 需要指明数据输入输出的类型,较麻烦,C++引入了cin 和 cout C++的 cin 和 cout 优点:可以自动识别类型 如果要控制浮点数的宽度和小数点后的位数,就可以直接用C语言的scanf(C++兼容C语言)

三、缺省参数

缺省参数相当于一个备胎,在函数传参时,如果没有参数就用缺省参数,有参数时,就不用缺省参数!

如果有多个参数需要传参时,遵循从左往右传参原则~!

以下为半缺省,半缺省默认传参为第一个,此时不可以不传参数!原则:从右往左连续缺省,不能间隔

缺省参数在实际中的应用为在一些数据结构中初始化一些数组时,不知道capacity大小而出现的问题~

四、函数重载

在C语言中我们是不允许一个同名函数定义不同的功能而C++弥补了这一缺点,引入了函数重载。 C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

为什么C++支持函数重载,而C语言不支持函数重载呢?–》C++支持函数重载的原理–名字修饰 原理:C++在链接中是用修饰过的名字去找,函数名相同就能找到,C语言直接通过函数名去找,在编译中函数名相同,编译出来生成符号表都去分不出来,所以C++可以函数重载,而C语言不能函数重载

C语言如何调用C++的库,C++如何调用C语言的库?–》 这里引用了 extren ‘C’

C++调用C语言库代码 :如下(示例):

// C++ 调用 C语言 的库

extern "C"

{

#include

}

extern “C”告诉C++的编译器,这里面的这些函数是C的库实现的,你用C的规则去链接查找他们!

C语言调用C++库代码 :如下(示例):

// C语言 调用 C++ 的库

#ifdef _cplusplus

extern "C"

{

#endif // _cplusplus

void StackInit(ST* ps);

// ....

#ifdef // _cplusplus

}

#endif // _cplusplus

五、引用

引用特性: 1.引用在定义时必须初始化!

2.一个变量可以有多个引用!

3.引用一旦引用一个实体,再不能引用其他实体!

引用的使用场景 1、做参数- -a.输出型参数;b.大对象传参提高效率 在交换函数中就很好地体现这一点! 而我们在定义某些数据结构时,运用引用也很方便!

代码如下(示例):

void SLPushBack(SL& s , int x)

{}

2、做返回值- -a.输出型返回对象,调用者可以修改返回对象;b.减少拷贝,提高效率 为什么传引用返回比传值返回快呢?

结论:上面的程序使用引用返回本质是不对的,结果是没有保障的!

下面这个场景,才会使用传引用返回 :如下(示例):

int& Count()

{

static int n = 0;

n++;

//......

return n;

}

int main()

{

int& ret = Count();

cout << ret << endl;

cout << ret << endl;

return 0;

}

传引用返回的实例: 我们在写动态顺序表中的 改top位置的数据时,会用到 查找函数+修改函数,很麻烦!所以我们用传引用来优化一下

原来的修改top位置的数据代码: 如下(示例):

// 顺序表中在指定位置插入一个数据

void SeqListInsert(SeqList* ps, int pos, SLDataType x)

{

assert(pos <= ps->size && pos >= 0);

SeqLisrCheckCapacity(ps);

int end = ps->size - 1;

while (end >= pos)

{

ps->a[end + 1] = ps->a[end];

end--;

}

ps->a[pos] = x;

ps->size++;

}

现在传引用返回中 的修改top位置的数据代码: 如下(示例):

// 顺序表中在指定位置插入一个数据

int& SLAt(SL& s, int pos)

{

assert(pos >= 0 && pos <= s.size);

return s.a[pos];

}

需要注意的一点是:运用引用的时候,权限不能放大,但是权限可以缩小!

如果引用会改变类型,也要加const防止权限扩大!

函数传参的时候也要注意:

引用和指针的不同点: 指针和引用用途基本是相似的,在这里我们从两个方面去区分二者:1.使用场景;2.语法特性及底层原理。

1. 引用在定义时必须初始化,指针没有要求

2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

3. 没有NULL引用,但有NULL指针

4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

6. 有多级指针,但是没有多级引用

7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

8. 引用比指针使用起来相对更安全

六、内联函数

在之前学过的堆排序和快速排序中,如果排序10w数据,就会调用很多次swap函数,就会有很多函数压栈的开销。 短小的函数(1~10行)、频繁的调用(10万次)为了解决这一现象,C语言引入了宏函数;C++引入了inline内联函数! 可是C++的创建者又发现C语言中的宏很不方便,具体优缺点如下:

宏的优点:a.复用性变强、b.宏函数提高效率,减少栈帧建立

宏的缺点:a.可读性差;b.没有类型的安全检查;c.不方便调试

C++引入了内联函数,在函数前加inline,在main函数调用的时候就会有选择性地展开!

如果函数调用次数过多,编译器就会选择不展开!

inline的特性 :如下(示例):

1.inline是一种以空间换时间的做法,省去函数栈帧额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联函数。

2.inline对于编译器而言只是一个建议,编译器会自动优化。如果定义为inline的函数体内有函数内部实现代码指令长度比较长

(10行左右,不同编译器不同)/递归等,编译器优化时会忽略掉内联。

3.inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到。

七、auto关键字

auto对于我们目前来说简单理解,后面学习会不断完善。 我们目前运用auto关键字可以:1.使用auto来遍历数组! 2.类型比较长时,auto自动推导

1.auto遍历数组方式 : 如下(示例):

// auto遍历数组

int main()

{

// 旧版的遍历a数组 low

int a[] = { 1,2,3,4,5,6,7,8,9,10 };

for (int i = 0; i < sizeof(a) / sizeof(int); i++)

{

cout << a[i] << " ";

}

cout << endl;

// 运用范围for(auto关键字)自动依次取a的数据,赋值给e

for (auto e : a)

{

cout << e << " ";

}

cout << endl;

return 0;

}

2.当类型比较长的时候,auto会自动推导!

这里要注意:auto自动识别的是数据类型,可以用来强调传参!

八、指针空值nullptr

C语言中空指针NULL为0,这样就会有些问题! 这里就会把NULL误认为是0,也就是int类型,C++之父为了解决这个问题,引入了nullptr关键字

总结

以上就是今天要讲的内容,本文简单介绍了C++相比于C语言新增的一些特性。缺省参数、函数重载、引用等特性! 如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!

相关推荐

俺莱芜,从不缺“一鼓作气”的劲儿
365体育投注下载

俺莱芜,从不缺“一鼓作气”的劲儿

📅 07-28 👁️ 1936
蒙古包蚊帐轻松折叠指南大揭秘
日博365官网手机版

蒙古包蚊帐轻松折叠指南大揭秘

📅 09-04 👁️ 407
成都公交705路收车时间?
365网络科技有限公司是做什么的

成都公交705路收车时间?

📅 07-16 👁️ 1726
笔记本电池信息查询与电池更换
日博365官网手机版

笔记本电池信息查询与电池更换

📅 07-14 👁️ 3117
苹果手机如何关闭通讯录同步功能及其注意事项
365体育投注下载

苹果手机如何关闭通讯录同步功能及其注意事项

📅 09-19 👁️ 5726
非检是什么意思
日博365官网手机版

非检是什么意思

📅 07-06 👁️ 8860