
🔥个人主页:@草莓熊Lotso 🎬作者简介:C++研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《Leetcode刷题指南》《C++知识分享》 ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言: 我们在前面学习完了C语言和数据结构初阶这两大块知识,后续的话就是C++版块的学习了,C++的学习是个持久战,它的知识点多而且普遍比较难。但是我们有了前期学习的积累,上手起来还是比较快的。那么C++知识分享的第一篇博客我主要是想给大家分享一下C++的发展历史,版本更新以及命名空间等知识点,在入门基础知识中讲到的一些语法主要是为了弥补C语言中的一些不足之处。
--我们把C++的发展历史归纳为以下几个关键节点
--我们通过一个表格和图片来了解一下C++的版本更新过程。


C++学习参考文档和书籍推荐:
参考文档:
注意:第一个链接不是C++官方文档,标准只更新到了C++11,但是以头文件的形式呈现,内容比较容易看懂。后面一个是C++官方的文档,信息很全,更新也是最新的,但是对比第一个就没那么容易看了,另外两者都是英文版的。这两个文档建议大家结合起来使用。
推荐书籍:

--C++兼容C语言绝大多数的语法,所有C语言实现的hello world在C++中依旧可以运行,但是C++是有自己的一套输入输出的,我们对比着看看。
C语言版本:
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}C++版本:这里的一些语法我们现在看不懂也没事后续都会讲解
#include<iostream>//不需要带.h
using namespace std;
int main()
{
cout << "Hello World" << '\n';
cout << "Hello World" << endl;
return 0;
}C语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d", rand);
//这种不行,因为rand是stdlib中的的一个库函数,重定义了
return 0;
}
正常的命名空间定义: (注意看注释)
#include<stdio.h>
#include<stdlib.h>
namespace Lotso
{
//命名空间可以定义变量/函数/类型
int rand = 10;
int Sub(int x, int y)
{
return x - y;
}
struct Node
{
struct Node* next;
int data;
};
}//这里是没有;的
int main()
{
//默认访问的是全局的rand函数指针
printf("%p\n", rand);
//编译器语法查找确认规则是默认先局部查找->全局查找->没有找到就报未声明的标识符这个错误
//::域作用限定符,这里指定作用域,就直接按这个域去找->没有找到就报未声明的标识符这个错误
printf("%d\n", Lotso::rand);
//这底下的就不详细讲述了,很好理解
printf("%p\n", Lotso::Sub);
printf("%d\n", Lotso::Sub(5,3));//2
struct Lotso::Node node;
return 0;
}
命名空间的嵌套使用:
//命名空间的嵌套使用
#include<stdio.h>
#include<stdlib.h>
namespace Lotso
{
namespace A
{
int rand = 10;
int Sub(int x, int y)
{
return x - y;
}
}
namespace B
{
int rand = 20;
int Sub(int x, int y)
{
return x - y;
}
}
}
int main()
{
printf("%d\n", Lotso::A::rand);//10
printf("%d\n", Lotso::B::rand);//20
printf("%d\n", Lotso::A::Sub(5,3));//2
printf("%d\n", Lotso::B::Sub(6,2));//4
return 0;
}
我们在项目经常可以使用到命名空间的嵌套,大家可以看下面这个图片来理解一下:

--多文件中可以定义同名namespace,他们会默认合并在一起,就像同一个namespace一样,这里演示起来逻辑简单但是代码量还是比较多的。大家有兴趣的可以拿之前的栈和队列自己试一下。
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。我们使用命名空间中定义的变量/函数,有以下三种方式:
--我们下面先拿std库里的几个函数来举例说明一下,后续会详细讲述
命名空间中成员部分展开:
#include<iostream>
#include<algorithm>
//命名空间中成员部分展开
using std::cout;
int main()
{
int a, b;
std::cin >> a >> b;//输入
cout << a << " " << b << '\n';//输出
return 0;
}--在这里我们可以观察到部分展开了之后cout就不需要在前面加东西了,但是cin还是要的
命名空间中成员全部展开:
#include<iostream>
#include<algorithm>
//命名空间中成员全部展开
using namespace std;
int main()
{
int a, b;
cin >> a >> b;//输入
cout << a << " " << b << '\n';//输出
return 0;
}--这里就都不需要指定命名空间去访问了,平常刷题时使用起来确实是很方便的,大的项目还是推荐大家不要这样用。
往期回顾:
结语:本篇博客就到此结束了,后续还需要通过1-2篇博客给大家讲完这些补充C语言不足之处的小语法才会进入类和对象的学习,C++的学习是一个比较平滑的过程,中间的难度提升不会一下就特别多,是一个慢慢进步的过程。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。