目录
[1. C++前言介绍](#1. C++前言介绍)
1. C++前言介绍
1.1什么是C++?
C++ 是一门通用、高性能、跨平台 的面向对象编程语言 ,由丹麦计算机科学家 本贾尼・斯特劳斯特鲁普(Bjarne Stroustrup) 在 1979 年左右,基于 C 语言扩展开发而来。
简单来说:C++ = C 语言 + 面向对象 + 现代编程特性,它既保留了 C 语言操作硬件、极致高效的优点,又增加了更适合开发大型软件的高级功能。
1.2C++的发展历史


C++还在不断的向后发展 。但是:现在社会上主流使用还是C++98 和C++11,所有重点要把C++98和C++11 掌握好,随着对C++理解不断加深,有时间可以去琢磨下更新的特性。
2.命名空间
2.1关于命名空间(namespace)
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的
----- 命名空间就是为了防止「名字冲突」,让代码更安全、更清晰
例如:你想创建一个rand的全局变量,但与所用库里面的冲突了,这时候就会报错
注:编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找
cpp
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 编译报错:error C2365: "rand": 重定义;以前的定义是"函数"
printf("%d\n", rand);
return 0;
}
接下来我们就可以创建一个自己的命名空间
cpp
#include<stdlib.h>
#include<stdio.h>
//namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下
//⾯的rand不在冲突了
namespace qt//命名空间的名字
{
//定义变量
int rand=10; //这样就不会报错了
//定义函数
int Add(int a,int b)
{
return a+b;
}
//定义类型
struct node
{
struct node*next;
int val;
};
//嵌套命名空间
namespace sub
{
int c;
int d;
int Sub(int a, int b)
{
return a - b;
}
}
int main()
{
// 这⾥默认是访问的是全局的rand函数指针
printf("%p\n", rand);
// 这⾥指定bit命名空间中的rand
printf("%d\n", bit::rand);
return 0;
}
上面的代码定义了一个名为qt的命名空间,该命名空间包含有变量、函数、类型、命名空间。和其他名字一样,命名空间的名字也必须在定义它的作用域内保持唯一 ,如果在同一个作用域中出现多个相同名字的命名空间,编译器最后会把他们合并,这意味着命名空间可以是不连续的。命名空间既可以定义在全局作用域内,也可以定义在其他命名空间中,但是不能定义在函数或类的内部。、
2.2命名空间的使用
每个命名空间都是一个作用域
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。
命名空间中的每个名字都必须表示该命名空间内的 唯一实体 。因为不同命名空间的作用域不同,所以 在不同命名空间内可以有相同名字的成员。
定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问,也可以被这些成员内嵌作用域中的任何单位访问。 位于该命名空间之外的代码则必须通过域作用限定符::明确指出所用的名字属于哪个命名空间
cpp
namespace qt
{
int a = 10;
int b = 20;
}
int a = 30;//全局
int main()
{
int a = 20;//局部
printf("%d\n", a);
printf("%d\n", ::a); // ::前面什么都不写代表全局域
printf("%d\n", qt::a); //qt的命名空间
return 0;
}

接下来是命名空间的三种使用方法
1.命名空间名称及作用域限定符
cpp
int main()
{
printf("%d\n", qt::a);
return 0;
}
2.使用using将命名空间中某个成员展开
cpp
using qt::a;
int main()
{
int a=10;
printf("%d\n", qt::a);
printf("%d\n", a);
return 0;
}
3.展开命名空间的所有成员
cpp
using namespce qt;//展开
int a=100;
int main()
{
printf("%d\n", a);//这里会报错
printf("%d\n", qt::a);//要明确出自哪里
printf("%d\n", b);
return 0;
}
using namespace qt这是将整个命名空间展开,将使得所有作用域都可以访问qt
当命名空间被展开,很可能会跟其他定义的名字成员产生冲突。但是这种冲突是被允许的 ,但必须明确指出名字的命名空间
2.3嵌套命名空间
嵌套的命名空间同时是一个嵌套的作用域,它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似:内层命名空间声明的名字将隐藏外层命名空间声明的 同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效,外层命名空间的代码想要访问它必须在名字前添加限定符。
cpp
namespace qt
{
int a = 10;
namespace qt1
{
int a = 10;//将外层作用域的a隐藏了
int b = 20;
}
int c = qt1::b;//正确访问的是qt1里面的d
namespace qt2
{
int q = qt1::d;//正确
}
}
int main()
{
printf("%d\n", qt::qt2::q);
printf("%d\n", qt::qt1::a);
printf("%d\n", qt::a);
return 0;
}
3.C++输入输出
cpp
#include<iostream>
using namespace std;
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
int main()
{
cout << "Hello C++" << endl;
return 0;
}
关于<iostream>是c++的头文件(新编译器),不+.h(有点旧编译器还支持<iostream.h>格式)
cout标准输出对象(控制台) ,endl输出换行符 + 刷新缓冲区 ,专门用在 cout 输出语句里。
cin标准输入对象(键盘),它们都要包含头文件及按照命名空间的使用方法去使用std
<<是流插入运算符,>>是流提取运算符。
使用C++的输入输出更加方便,不需要像printf和scanf输入输出那样,需要手动控制格式。C++的输入输出可以自动识别变量类型(本质上是运算符重载),但cout和cin的效率比较低。