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

简介: 【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关键字的出现就是针对这种问题的。


#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
    printf("%d\n", rand);
    return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”


命名空间的定义


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


//定义一个名字为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
}


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


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


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;
}


命名空间可以嵌套定义


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
}


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


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)。


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


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,使得其可以作为内部连接


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


命名空间的使用


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


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 命名空间名称 引入


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++的内容。一起加油吧!!!


目录
相关文章
|
1月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
16天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
6天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
21 0
|
29天前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
42 2
|
16天前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
1月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
25 5
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
49 4
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
33 4
|
1月前
|
编译器 程序员 C语言
C++入门
C++入门
31 5
|
1月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组