谈谈C++弥补了C语言的哪些缺陷?

技术流战士2024-06-20 20:54:17  59

一、命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字由此而生。

实例:

#include #include int rand = 10;// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决int main{ printf("%d ", rand);return 0;}// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

1.1 命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

Tips:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

// 1. 正常的命名空间定义namespace N1{ // 命名空间中可以定义变量/函数/类型 int rand = 10; int Add(int left, int right)//函数 { return left + right; } struct Node//结构体类型 { struct Node* next; int val; };}

//2. 命名空间可以嵌套namespace N1{ int a; int b; int Add(int left, int right) { return left + right; } namespace N2//嵌套命名空间 { int c; int d; int Sub(int left, int right) { return left - right; } }}

//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。//Queue.hnamespace N1{ void QueueInit { cout << "QueueInit" << endl; }}//Stack.hnamespace N1{ void StackInit { cout << "StackInit" << endl; }}//下面两个文件在Cpp文件中展开时,两个相同命名空间会自动合并成一个Test.cpp#include "Queue.h"#include "Stack.h"

1.2 命名空间使用

命名空间中成员该如何使用呢?比如下面直接访问:

namespace bit{ // 命名空间中可以定义变量/函数/类型 int a = 0; int b = 1; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; };} int main{ // 编译报错:error C2065: “a”: 未声明的标识符 printf("%d ", a); return 0;}

正确命名空间有下面3中用法:

1.加命名空间名称及作用域限定符

int main{ printf("%d ", N::a);//::是作用限定符 return 0; }

2.使用using将命名空间中某个成员引入

using N::b;int main{ printf("%d ", N::a); printf("%d ", b); return 0; }

3.使用using namespace 命名空间名称 引入

using namespce N;int main{ printf("%d ", a); printf("%d ", b); Add(10, 20); return 0; }

二、C++输入、输出

新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,那C++是否也应该向这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。

#include// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中using namespace std;int main{ char c,int i,double d; //自动识别变量的类型 cin>>c>>i>>d;//输入c/i/d cout<

说明:

使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。

<<是流插入运算符,>>是流提取运算符

实际上cout和cin分别是ostream和istream类型的对象。cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出(,他们都包含在包含头文件中。使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格。C++的输入输出可以自动识别变量类型

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持格式,后续编译器已不支持,因此推荐使用+std的方式

2.1 std命名空间的使用惯例

std是C++标准库的命名空间,如何展开std使用更合理呢?

在日常练习中,建议直接using namespace std即可,这样就很方便。

using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

三、缺省参数

在实际项目中,当需要开辟一块空间时,我们经常会遇到这样一个问题:空间应该开多大。开大了,浪费空间;开小了,虽然realloc可以扩容,但当如果这块空间很大,多次扩容不仅麻烦,而且会导致性能下降。为了解决这个问题,祖师爷本贾尼给出了缺省参数。

3.1 缺省参数的定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0){ cout<

3.2 缺省参数分类

全缺省参数

void Func(int a = 10, int b = 20, int c = 30) { cout<<"a = "<

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/793408.html
0
随机主题
吴绮莉曾称家门永远向女儿敞开, 晒切蒜视频遭嘲, 被问怎么沦落了保时捷纯电第二弹,保时捷纯电Macan新年创业加盟哪家强? 社区生鲜连锁品牌钱大妈有话说!云辟谣|成都熊猫基地14号圈舍环境恶劣, 场馆设施不达标? 系谣言什么时候买摩托车最划算?今年荔枝让人“高攀不起”? 整体减产, 妃子笑已经降价印度种姓制度虎牢关时期, 谁能抵挡吕布100招? 仅2人可以, 关羽张飞赵云都不行五羊本田全新级车上市,五种配色可选,配单缸风冷动力俄罗斯别尔哥罗德市传出多次爆炸声,此前已发布导弹警报DNF: 新副本传奇页游风, 记录室钥匙千万留好! 每周7次奖励拉满国内首台甲醇双燃料低速机在中船发动机成功交验女子为了帮衬娘家, 婚内转移财产300万, 丈夫得知后诉讼离婚开着元PLUS去春游! 更适合年轻人的“移动空间”小米SU7上市之后,新能源二手车绷不住了,特斯拉也拉裤兜子了打脸! 爱德华兹赛前放豪言, 欧文30分关键罚球, NBA各界嘲讽虽然这场战争结局未卜, 普京已经在将自己与彼得大帝相提并论评分上海海港: 颜骏凌拯救, 莱奥救赎, 巴尔加斯两次踏进同一河流KPL春季赛最佳阵容有变? AG300W卖壶神, KPL大瓜: 九尾不打夏季赛四部门: 优化外商投资环境, 继续缩减外资准入负面清单5年2.45亿, 多赚4100万! 联盟两大新星, 带队闯进分区决赛
最新回复(0)