C++命名空间

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++编译器会自动的把不属于任何名字空间的标识符(全局变量,函数名,类型名…)都放到无名名字空间。
​使用无名名字空间中的名字:
::要访问的名字

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QJ敬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值