文章目录
1 C++简介
C++是一门以C为基础,发展而来的面向对象的程序设计语言。
1983 由Bjarne(比扬尼)在贝尔实验室创建 C with class
1984 改名为C++ C plus plus
1987 g++
1998 C++98()国际标准发布。称为C++ISO98,以后每5年更新一次标准
2003 C++03
2011 C++11()这次标准对C++语言的影响很大,称为现代C++(新标准)
2014 C++14
2017 C++17
2020 C++20
…
编译器:
GUN/linux平台使用g++,如果系统没有预装,则需要自己安装
sudo apt-get install g++
ARM平台使用arm-linux-g++,要求支持c++11(参考交叉开发的内容)
windows中也可以使用g++,g++的windows版本称为minGW
…
组成:
语言本身(各种各样的基础语法)。
库(标准库(STL:算法/容器/迭代器)和第三方库)。
2 第一个C++程序
程序由两部分组成:分别是头文件(#include)和程序的主函数(main)。
C++是以C语言为基础的,所以C++全面的兼容C语言(C中可以用的在C++中基本上都可以使用)
cin
表示标准输入,即stdin
cout
表示标准输出,即stdout
clog
表示标准错误,带缓冲的标准错误
cerr
表示标准错误,即stderr
在C++中,可以设置输出对象(cout)的属性,如:
输出的整数的进制,用hex表示16进制,使用oct表示八进制,使用dec表示十进制
#include<iostream> //头文件,用于支持基本的输入输出功能
#include<stdio.h>
int main()
{
printf("hello world!\n");
//std::cerr
//std::clog
std::cout << "hello c++" <<std::endl; //输出内容到标准输出
int a,b;
std::cin >> a >> b; //从标准输入获取两个整数
std::cout << std::hex ; //设置输出流对象的格式为16进制
std::cout << a << "+" << b << "=" <<a+b <<std::endl;
std::cout << std::dec;
std::cout << a << "+" << b << "=" <<a+b <<std::endl;
return 0;
}
对比于C语言程序,有哪些地方不一样?
<< (c-out)
在C语言中是左移运算符,在C++中依然具有左移的功能,但是我们又给它添加了新的功能(运算符重载),和cout这个变量放在一起,用于输出,也称为输出运算符。
cout ----> console output 控制台输出(命令行) ----->stdout
>> (c-in)
在C语言中是右移运算符,在C++中依然具有右移的功能,但是我们又给它添加了新的功能(运算符重载),和cin这个变量放在一起,用于输入,也称为输入运算符。
cin ----> console input 控制台输入(命令行) ----->stdin
头文件
iostream,就是一个被包含的头文件,在目录/usr/include/c++/7.5.0/
中
在原来的C语言中,头文件都是以xx.h的形式存在的,在C++中,头文件只有名字,没有后缀(.h)如:iostream
原有的C体系中的部分头文件任然以.h
的形式存在,还有部分头文件被升级到C++体系中,在原有的名字
前面加一个字符c,把后面的.h
去掉了
如:stdio.h ----->cstdio
string.h ----->cstring
在C++中任然可以使用C语言中的所有头文件和头文件中的函数
后缀名 .cpp .C .cxx
编译器 g++
::
作用域运算符
std::cout
std就是一个作用域的名字,是单词"standard"的缩写,是标准C++库中的一个作用域名称。
这个作用域(std)中定义了标准库中所有的名字,我们把这种专门用来定义名字的作用域称为名字空间(namespace)。也就是说std::cout
指的是cout
这个名字来源于std
这个名字空间。
3 名字空间(namespace)
3.1 为什么需要名字空间?
名字空间是ANSIC++
引入的可以由用户命名的作用域。
本质:由程序设计者命名的内存区域。
作用:用于存放各种各样的名称(变量名/类型名…),达到避免名字冲突的目的。
3.2 定义方法
namespace 是定义名字空间的关键字
namespace ns1
{
各种名字(变量名/类型名...)
...
namespace ns2 //嵌套定义名字空间
{
各种名字
....
};
};
其中,ns1就是我们自己定义的名字空间名称,如果我们需要使用名字空间中的对象名,则需要加作用域,
可以包括:
- 变量名
- 函数名
- 常量
- 结构体
- 类型名
- 模板
- 嵌套名字空间
- …
3.3 使用方法(先定义再使用)
3.3.1 使用作用域运算符
名字空间名称::要访问的名字
std::cout
3.3.2 名字空间指令(using 指令)
using namespace 名字空间名称;
如:
1)using namespace std;
就是把指定的名字空间中的所有的名字都导入到当前的作用域。
2)std::cout ------> cout
using namespace Ns1;
把Ns1中所有的名字都导入到当前作用域,就可以像使用普通变量一样使用名字空间中的名字。
3.3.3 名字空间声明(using 声明)
using 名字空间名称::名字;
如:
using std::cout;
就是把名字空间中指定的名字导入到当前的作用域。
3.3.4 使用using声明更加安全
一般来说,使用using声明,比使用using指令更加安全,这是因为
using声明只会引入指定的名称。
using指令容易造成"名字污染"。
3.3.5 使用名字空间别名
可以使用名字空间别名,为名字空间取一个别名(namespace alias)。一般是用来代替较长的名字空间名称。
如:
namespace Television
{
.....
};
namespace TV=Television; //别名TV就和原名等价
3.3.5 无名名字空间
C++编译器会自动的把不属于任何名字空间的标识符(全局变量,函数名,类型名…)都放到无名名字空间。
使用无名名字空间中的名字:
::要访问的名字