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

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

一、命名空间

在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
最新回复(0)