本文重点: 1.C++是如何诞生的 2.C++的应用领域 3.怎么学好C++ 4.C++版本的"Hello World" 5.命名空间 一.C++的诞生背景: ??C语言是一门面向过程的编程语言,注重的是模块化和结构化地解决问题。适合处理规模较小的问题。但是随着时代的发展,程序的规模越变越大,使用C语言管理这些程序的成本和难度也越来越高。而这些大规模的程序需要利用到高度的抽象机制,这也是C语言不擅长的事情。所以为了解决这一问题,程序员界的大佬提出了OOP的编程概念,就是我们现在常说的面向对象编程,这也为C++的诞生埋下了伏笔。 ??而在1982年,贝尔实验室的本贾尼博士就在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的语言,为了表明和C语言的渊源关系,这门语言被命名成C++。 这就是我们C++程序员的祖师爷:感谢祖师爷赏饭吃 二.C++的应用领域: ??计算机的学生肯定都知道,常年霸占编程语言排行榜前四名的语言是:C,C++,Java,Python可见C++在编程语言界的地位还是非常高的,那么C++语言擅长什么呢? 下面是C++常用的领域:
- 操作系统以及大型系统软件开发
- 服务器端开发
- 人工智能
- 网络工具
- 游戏开发
- 嵌入式领域
- 数字图像处理
- 分布式应用
- 移动设备
??不难看出,相对于Java这种只能做应用级别的编程语言,C++似乎更加全能,无论你是想要和硬件打交道还是做上层的软件应用,C++都可以处理,所以说学好C++是非常吃香的。 三.怎么学好C++ ??学C语言需要多多练习,学数据结构需要多多思考,画图和练习。那么学习C++呢?答案是学习C++更需要练习,思考和总结! 曾经有大佬把学习C++分成四个层次:
第一阶段:平平常常的普通人 这个阶段的你可能只是看过一些有关C++的入门书籍,对于C++还停留在一些简单的语法和应用级别 第二阶段:能够正确,高效地应用C++ 这个阶段的你可能已经有了一定的代码基础,这时候你就要从需要你去了解部分C++的底层原理。 第三阶段:深入解读C++ 恭喜你,到了这个阶段你已经是业界相对来说比较厉害的C++程序员了,这个时候的你的目标已经不仅仅停留在表层,而是要深度理解C++编程背后的思想: 第四阶段:研究C++ 到了这个阶段,你已经对C++这门语言相当理解地相当透彻了,这时候你能够做到由一段C++代码轻松可以看出它对应的汇编代码的水平。
不过对于大多数开发人员来讲,我们只要到第二层和第三层左右的水平就可以了。 ??很多人说C++难,难在C++的语法复杂和抽象机制,那么怎么才能学好C++呢? 1.多做笔记,C++零碎的小知识非常多,细节也非常多,所以常记笔记是很重要的 2.画思维导图,把所学的知识串联起来。 3.常看书,书籍是人类进步的阶梯。 4.多刷题---->leetcode和牛客 四.C++版本的"Hello World" ??讲了这么多,那么我们接下来就用C++写一个Hello World吧.
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
&emps;&emps;这里多出了好多C语言里没有的东西,在稍后我会进行介绍。首先,我们要明确一个概念,C++是兼容C语言的,所以你仍然可以在c++文件里使用纯C语言的语法!接下来就是这个全新的头文件—>iostream,这个是C++的一种特殊的输入输出—>流式输入输出,cout就是把结果输出到控制台,并且这个输出是不需要控制格式的。相对于C语言来说是非常好用的。另外你可能还注意到了我们使用了左移运算符,这个在后面的运算符重载会介绍到,现在你就记住:cout用左移运算符,cin用右移运算符就可以了而这里的endl是C++规定的一种替代换行符的操作。 五.命名空间 ??你可能还会对这么这个语句好奇:
using namespace std;
似乎绝大多数C++程序都有这么一个语句,那么这个语句的作用是什么呢?这个namespace又是何方神圣?接下来我们就来走进这个namespace. ??首先我们来看这样一段代码:
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
那么编译过后,会出现这么一条报错信息: 那么这里说rand重复定义了,因为stdlib.h头文件里有一个rand函数!所以在编译的时候就会出现二义性。这里是我们自己定义的变量和官方库里的函数起冲突,但是在实际生产环境下是我们可能在和其他人的代码进行合并的时候会起冲突。对于命名冲突,C语言并不能处理这个问题。所以C++为了填补C语言这个坑,引入了命名空间这个机制。 ??命名空间的以namespace关键字开头,后面跟着的是命名空间的名字:
namespace 空间名
接下来我们把我们自己定义的rand变量放到一个叫做chy的命名空间里去:
#include<stdio.h>
#include<stdlib.h>
namespace chy
{
int rand = 10;
}
int main()
{
printf("%p", rand);
return 0;
}
??这时候编译就能够正常通过了。命名空间的作用就相当于是一个隔离的病房把变量关到这个房间里。那么我们怎么能够访问命名空间里的变量呢?有如下三种方式:
方式一:使用作用域运算符::访问
namespace chy
{
int rand = 10;
}
int main()
{
printf("方式一访问:%d\n", chy::x);
return 0;
}
方式二:直接展开命名空间chy,这时候使用变量名就可以了
namespace chy
{
int rand = 10;
}
using namespace chy;
int main()
{
printf("方式二访问:%d\n", rand);
return 0;
}
方式三:只展开对应的变量,展开以后对应的变量名就可以直接使用
#include<stdio.h>
namespace chy
{
int rand = 10;
}
using chy::rand;
int main()
{
printf("方式三访问:%d\n", rand);
return 0;
}
??以上这三种方式就是访问命名空间里元素的方式。这三种方式各有优点和缺点。
方式一:书写繁琐,但是安全性最高,不会存在命名空间污染的问题。 方式二:书写简单,但是直接展开命名空间可能会造成空间污染 方式三:权衡了1,2,是比较理想的一种方式。
那么在大型项目里,为了防止命名空间的污染,最好做法就是只展开常用。而在平常我们自己写的小型代码是可以直接展开命名空间的。 再回到这个语句:
using namespace std;
C++标准库把一些容器,算法,还有类都封装到了一个叫做std的标准库里.所以我们才会看到这么一条语句。如果没有这句话,我们的helloworld就要这么写:
#include<iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
命名空间里什么都可以放:变量,函数,类,甚至还可以嵌套一个命名空间 接下来我在chy这个命名空间里再嵌套一个ypl的命名空间
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace chy
{
int x = 5;
namespace ypl
{
int y = 20;
}
}
int main()
{
printf("%d\n", chy::x);
printf("%d\n", chy::ypl::y);
return 0;
}
??可以看到我们要想访问到y,需要使用两次作用域运算符(第一次找到ypl命名空间,第二次找到y)。前面说过命名空间展开就可以直接展开,那么接下来我能否通过这个方式来寻找y
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace chy
{
int x = 5;
namespace ypl
{
int y = 20;
}
}
using namespace chy;
int main()
{
printf("%d\n", chy::x);
printf("%d\n", y);
return 0;
}
答案是否定的,因为你展开的只是chy这个命名空间,但是y变量还是再ypl这个空间,ypl并没有展开,所以访问y还是需要加上ypl命名空间。 所以正确的写法如下两种:
方法1:展开chy,使用ypl::y访问
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace chy
{
int x = 5;
namespace ypl
{
int y = 20;
}
}
using namespace chy;
int main()
{
printf("%d\n", chy::x);
printf("%d\n", ypl::y);
return 0;
}
方法2:展开命名空间ypl,直接使用y
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace chy
{
int x = 5;
namespace ypl
{
int y = 20;
}
}
using namespace chy::ypl;
int main()
{
printf("%d\n", chy::x);
printf("%d\n", y);
return 0;
}
讲完了嵌套命名空间,我们再来讲一讲定义两个同名的命名空间:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace chy
{
int x = 5;
namespace ypl
{
int y = 20;
}
}
namespace chy
{
int z = 20;
}
int main()
{
printf("%d\n", chy::x);
printf("%d\n", chy::z);
return 0;
}
那么在编译的时候,编译器会把两个同名的命名空间合并成一个命名空间。所以不要在两个同名的命名空间里面定义两个同名的变量! 总结:学好C++需要多练习,多思考,多总结,多看书。C++虽然语法复杂,但不代表学不会!!如果本文有不足之处或者是错误还望指出。希望能够共同进步 下集预告: ;1.缺省参数 2.什么是函数重载 ;3.函数重载的底层原理 4.extern "C"的用法
|