在C语言的基础上,C++新增了很多新特性。本篇博客主要介绍一些C++新增的常用的新特性。
1.输入输出(cin/cout)
在C语言中,我们通常会用scanf/printf进行输入输出。但用这两个库函数,我们需要记住像%d %s %f等等的占位符,输入输出会显得有些麻烦,而且占位符的类型还不能错。
于是C++引入了cin/cout。这么输入输出,就不用担心类型,编译器会识别。
下面是代码示例:
#include<iostream>usingnamespacestd;intmain(){cout<<"hello world"<<endl;cout<<123<<endl;cout<<1.23<<endl;intnum;cin>>num;cout<<num<<endl;return0;}
我们不难发现,cin/cout支持任意类型的输入输出,一步到位,这是C语言不具备的且好用的特性。
在使用cin/cout时,我们要注意包<iostream>。
2.namespace(命名空间)
在C语言,我们对变量名,函数名的命名可能会与标准库重名,或者在工程过大的时候,命名也可能会出现重名。比如:
#include<stdlib.h>intrand=10;intmain(){//编译报错:errorC2365:“rand”:重定义;以前的定义是“函数”printf("%d\n",rand);return0;}C++引入了一个namespace命名空间新特性,避免命名的冲突。
namespaceliwa{inttest=30;}inttest=20;intmain(){inttest=10;//默认拿到局部的testcout<<test<<endl;//::前为空则拿到全局的testcout<<::test<<endl;//::前指定命名空间,此处拿到liwa的testcout<<liwa::test<<endl;return0;}
在使用过程中我们会发现,有些函数/变量会被频繁使用,但是每次使用都用::会很麻烦
我们可以
1.using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
2.展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
//直接展开命名空间usingnamespacestd;//部分展开命名空间usingstd::cout;usingstd::cin;3.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。
下面用全缺省做示例:
intadd(intx=10,inty=20){returnx+y;}intmain(){cout<<add()<<endl;cout<<add(20)<<endl;cout<<add(30,30)<<endl;return0;}
注意:当函数有缺省参数时,实参必须从左到右给,不能跳跃。缺省参数必须是从右往左连续缺省,也不能跳跃。函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
4.函数重载
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。
intadd(intx=10,inty=20){returnx+y;}doubleadd(doublex,doubley){returnx+y;}intmain(){cout<<add(30,30)<<endl;cout<<add(1.5,2.6)<<endl;return0;}
编译器识别函数是否为重载函数只看函数的参数,与返回值无关,所以不能定义一个只有返回值不同的重载函数。其次,有缺省参数和无缺省参数的函数也不能构成重载。
5.引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型&引用别名=引用对象;
intmain(){inta=10;//b是a的别名int&b=a;//c是b的别名,也相当于是a的别名int&c=b;//d是a的别名int&d=a;cout<<&a<<endl;cout<<&b<<endl;cout<<&c<<endl;cout<<&d<<endl;return0;}
运行可以发现,abcd的地址是一样的,即共用一块内存空间。
注意:
1、引用在定义时必须初始化
2、一个变量可以有多个引用
3、引用一旦引用一个实体,再不能引用其他实体
5.inline
用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就不需要建立栈帧了,就可以提高效率。
下面是用法:
inlineintsub(intx=20,inty=10){returnx-y;}intmain(){cout<<sub()<<endl;return0;}inline对于编译器而言只是一个建议。inline适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline会被编译器忽略。
inline不建议声明和定义分离到两个文件,可能会导致链接错误。
6.nullptr
在C语言,我们用NULL表示空指针。NULL实际是一个宏,在C++中定义为整型0,在C中定义为无类型空指针(void*)0。
在C++,如果一个函数的参数是指针,我们传NULL就会变成传整型,类型不匹配,即使传(void*)NULL编译器也会报错,和C语言不同,void*和其他类型的指针类型不匹配。
所以C++引入一个nullptr关键字,这个nullptr代表空指针,并且可以自动转换类型,与参数适配。
举个例子:
voidf(int*pi){cout<<"f(int*)"<<endl;}voidf(inti){cout<<"f(int)"<<endl;}intmain(){f(NULL);f(nullptr);return0;}以上就是C++在C上新增的一些特性,希望对大家有帮助。