【C++入门到精通】 C++入门—命名空间

前言

前面我们学习了C语言,并且知道了C语言的基础语法与用途。接下来一段时间我们会再来学习一下基于C语言并且根据C语言改造的一门新的语言---C++

硕硕相信只要各位大佬们跟着我的博客看下去,肯定能有不少的收获。二话不说咱们要开车了,坐稳扶好呦

C++的发展历史

硕硕认为学习一门新的学科之前首先要知道或者了解这门学科的历史,正所"知己知彼,百战不殆 "。首先我们先来了解一下什么是C++,C++是一门应用非常广泛的计算机程序设计语言。它是一种通用的程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。

C++语言是由C语言发展而来的,C++语言是美国贝尔实验室的比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)博士以及同事于20世纪80年代初期在C语言的基础上发明并实现的,最初被称为C with Classes,1983年被更名为C++,C++语言发展可以大概分为3个阶段。

C++发展的三个阶段性飞跃

⭕第一阶段: 第一阶段从80年代初到1995年。这个阶段C++基本上是传统上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大的份额;

⭕第二阶段: 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

⭕第三阶段: 第三阶段从2000年至今,由于以Loki、MPL(Boost)等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

命名空间

在C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

arduino 复制代码
#include <stdio.h>
#include <stdlib.h>

int rand = 10;

// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
    printf("%d\n", rand);
    return 0;
}

// 编译后后报错:error C2365: "rand": 重定义;以前的定义是"函数"

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

c 复制代码
//定义一个名字为A的命名空间(变量、函数)
namespace A 
{
    int a = 100;
}
namespace B 
{
    int a = 200;
}
void test02()
{
    //A::a  a是属于A中
    cout<<"A中a = "<<A::a<<endl;//100
    cout<<"B中a = "<<B::a<<endl;//200
}

命名空间只能全局范围内定义

下面就是错误的写法 (局部定义命名空间是错误的)

less 复制代码
int main()
{
    namespace A  //局部定义命名空间是错误的
    {
        int a = 1;
    }
    namespace B
    {
        int a = 2;
    }
    count << "A::a : " << A::a << endl;
    count << "B::a : " << B::a << endl;
    return 0;
}

命名空间可以嵌套定义

c 复制代码
namespace A 
{
    int a = 1000;
    namespace B 
    {
        int a = 2000;
    }
}
void test03()
{
    cout<<"A中的a = "<<A::a<<endl; //1000
    cout<<"B中的a = "<<A::B::a<<endl; //2000
}

允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

c 复制代码
namespace A 
{
    int a = 100;
    int b = 200;
}

namespace A 
{
    int c = 300;
}
void test04()
{
    cout<<"A中a = "<<A::a<<endl;//100
    cout<<"A中c = "<<A::c<<endl;//200
}

命名空间可以存放的变量类型

在C++中,命名空间(namespace)可以存放各种类型的变量,包括但不限于以下类型

1.基本数据类型变量,如整型(int)、浮点型(float)、字符型(char)等
2.自定义的结构体(struct)或类(class)的对象
3.枚举类型(enum)的变量。
4.指针类型变量,可以指向不同类型的数据
5.数组类型变量,可以是一维或多维数组。
6.函数指针类型,指向特定函数的指针。
7.类型别名(typedef)或类型定义(using)。

命名空间中的函数 可以在"命名空间"外 定义

c 复制代码
namespace A 
{
    int a=100;//变量
 
    void func();
}
 
void A::func()//成员函数 在外部定义的时候 记得加作用域
{
    //访问命名空间的数据不用加作用域
    cout<<"func-a = "<<a<<endl;
}
 
void funb()//普通函数
{
    cout<<"funb-a = "<<A::a<<endl;
}
void test06()
{
   A::func();
    funb();
}

无名命名空间

意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接

c 复制代码
namespace
{
    int a = 10;
    void func()
    {
        cout<<"hello namespace"<<endl;
    }
}
void test()
{
 
    //只能在当前源文件直接访问a 或 func
    cout<<"a = "<<a<<endl;
    func();
}

命名空间的使用

使用using将命名空间中某个成员引入

arduino 复制代码
namespace N
{
    // 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}

使用using namespace 命名空间名称 引入

arduino 复制代码
namespace N
{
    // 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;
}

总结

学了这些相信大家也跟我一样对C++的命名空间有了初步的了解,如果对博主的文章感兴趣的话可以三连加关注,后面我也会更新C++的内容。一起加油吧!!!

相关推荐
重生之我是数学王子8 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
我们的五年31 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
做人不要太理性1 小时前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.1 小时前
2、桥接模式
c++·桥接模式
chnming19871 小时前
STL关联式容器之map
开发语言·c++
程序伍六七1 小时前
day16
开发语言·c++
小陈phd2 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
火山口车神丶2 小时前
某车企ASW面试笔试题
c++·matlab
是阿建吖!2 小时前
【优选算法】二分查找
c++·算法
Ajiang28247353044 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++