什么是C++
C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
C++发展史
1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。
我们先来看下C++的历史版本:
现在公司主流使用还是C++98和C++11。
关于C++2X最新特性的讨论:
https://zhuanlan.zhihu.com/p/107360459
C++现状:
C/C++在TIOBE编程语言社区
常年位居前五
在23年更是霸榜前三!
C++在工作领域中的应用
- 操作系统以及大型系统软件开发
- 服务器端开发
- 游戏开发
- 嵌入式和物联网领域
- 数字图像处理
- 人工智能
- 分布式应用
C++入门部分
C++关键字:
C++总计63个关键字,C语言32个关键字。
命名空间:
在介绍命名空间之前,先看下面代码所示:
#include<stdio.h> int rand = 10; int main() { printf("%d", rand); return 0; }
这个代码很简单,实现的功能就是打印rand函数的值。(这里赋值为10.并且以全局变量定义)
那我们在这个代码实现的基础上加一个头文件:
#include<stdlib.h>
也就是说:
#include<stdio.h> #include<stdlib.h> int rand = 10; int main() { printf("%d", rand); return 0; }
我们看一下在编译器中运行的结果:
加了个头文件后,编译器报错了,这是为什么呢?
我们看报错原因:说是rand函数重定义。这是因为在库中已经有了rand这个函数,如果再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand,因而报错。
那么如何解决这个问题呢?
这就是我们要首先介绍的命名空间。
C++为了解决C语言上述的问题
引出了命名空间这种玩法
(C++兼容C语言的所有语法)
命名空间定义:
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
//NIC是命名空间的名字,一般开发中是用项目名字做命名空间名。 namespace NIC { // 命名空间中可以定义变量/函数/类型 int rand = 10;//变量 int Add(int left, int right)//函数 { return left + right; } struct Test//结构体 { int a[10]; int val; }; }
命名空间相当于一个独立的作用域
命名空间中所有内容都局限于该命名空间中
当然,命名空间也可以嵌套:
namespace NIC { // 命名空间中可以定义变量/函数/类型 int rand = 10;//变量 int Add(int left, int right)//函数 { return left + right; } struct Test//结构体 { int a[10]; int val; }; //命名空间的嵌套: namespace NIC2 { int a; int b; int sum(int x, int y) { return x + y; } struct Student { int ID; char Name[20]; }; } }
命名空间的使用:
那么我们回到我们最初的那个问题,既然我们现在知道了是函数冲突产生的问题,并且用命名空间解决,那么如何使用呢?
先看下面代码示例:
int main() { printf("%d", NIC::rand); return 0; }
我们刚才把rand函数包装在了我们的命名空间里,这里我们要打印rand的值,采用了命名空间名+::的形式,这就是使用命名空间的第一种方法:加命名空间名称及作用域限定符。
方法一:加命名空间名称及作用域限定符(不展开命名空间)
:: 域作用限定符。
通过域作用符我们就可以访问命名空间中的成员:
int main() { printf("%d\n", NIC::rand); int b = NIC::Add(1, 3); printf("%d", b); struct NIC::Test node; return 0; }
结果显示:
这个代码示例我们访问了我们命名空间里面的rand和Add函数。最后一个我们开辟了结构体的新节点。
方法二:使用using将命名空间中某个成员引入(展开空间中部分内容)
假设NIC空间中的rand使用频率很高
可以将rand变量单独展开到全局域
using NIC::rand;
假设NIC空间中的Add函数使用频率很高
可以将Add函数单独展开到全局域
using NIC::Add;
看一下测试代码:
using NIC::rand; int main() { int b = rand;//rand展开直接用 int c = NIC::Add(3, 5);//Add没有展开,需要用域作用符::访问 printf("%d\n%d", b, c); return 0; }
结果如下:
方法三:使用using namespace 命名空间名称 引入(展开空间中全部内容)
在空间NIC后面加上
using namespace NEO;
这句话的意思是:
将空间NIC展开为全局域
我们在看C++程序时经常看见:
using namespace std;
std就是C++的标准库。
当NIC空间被展开后
空间里的所有内容可以直接使用:
namespace NIC { // 命名空间中可以定义变量/函数/类型 int rand = 10;//变量 int Add(int left, int right)//函数 { return left + right; } struct Test//结构体 { int a[10]; int val; }; //命名空间的嵌套: namespace NIC2 { int a; int b; int sum(int x, int y) { return x + y; } struct Student { int ID; char Name[20]; }; } } using namespace NIC; int main() { int b = rand; printf("%d", b); return 0; }
结果如下:
对命名空间展开的思考
假设我们将自定义NIC空间和标准库的std空间同时展开
那么整型变量rand和rand函数同时暴露在全局域
我们再去使用它时也会报错:
using namespace std; using namespace NIC;
所以直接展开std标准库也有冲突风险
但是不展开的话,写输入输出会很麻烦
那么平时写代码时应该怎么办?
结论:
1.写项目时,尽量不要展开标准库
2.日常练习时应该展开标准库
3.写项目使用部分常用内容展开
C++输入与输出:
C语言输入输出方式,相信大家都并不陌生,那么C++如何输入输出呢?
在C++中,输入输出用的是IO流,跟C语言一样,在使用C++输入输出前要包含一个头文件:
#include<iostream>
其次,因为输入输出函数直接在库里面,我们可以直接展开std库也可以访问std库。
using namespace std; using std::cout using std::cin using std::endl
具体用什么方式应人而异,根据自己习惯选择。
cout(标准输出对象(控制台))
C++中用:cout<< 来进行打印输出。(console:控制台 out:输出)
<<:流插入运算符
using std::cout; int main() { cout << "hello world\n"; return 0; }
输出结果:
从代码示例,我们可以理解为:hello word字符串就是流,流向到对象(终端)中去,进行打印输出。
补充1:
在C语言中,根据类型不同,我们用printf函数打印的时候,需要指定格式才能打印:
int main() { int a = 10; double b = 5.5; printf("%d %.2lf", a, b); return 0; }
但是我们C++中,会自动识别类型:
using std::cout; int main() { cout << "hello world\n"; int a = 10; double b = 5.5; cout << a<<"\n"; cout << b; return 0; }
输出结果:
不仅如此:打印的时候我们可以多次用<<流插入运算符。
using std::cout; int main() { cout << "hello world\n"; int a = 10; double b = 5.5; cout << a<<"\n"<<b<<"\n"<<"hello world\n"<<'\n'; return 0; }
输出结果:
补充2:
在C++中,我们可以用endl来表示换行符。(end:结尾 Line:行)
int main() { // IO流 // 自动识别输出变量的类型 // <<流插入 std::cout << "hello world\n"; int a = 10; double b = 11.11; //std::cout << a << "\n"; //std::cout << b << "\n"; std::cout << a << "\n" << b << '\n'; std::cout << a << std::endl << b << std::endl; return 0; }
输出结果:
cin(标准输入对象(键盘))
C++中用:cin>>来进行获取键盘输入。(console:控制台 in:里面)
<<:流提取运算符
using std::cin; using std::cout; using std::endl; int main() { int a; double b; // 流提取 cin >> a >> b; cout << a << endl << b << endl; cout << a << endl << b << endl; return 0; }
输出结果:
注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我
们可以进行网上查阅并仔细学习。