首页 > 编程语言 >【C++入门到精通】 C++入门—命名空间

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

时间:2024-01-20 16:32:50浏览次数:21  
标签:精通 入门 int namespace 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”: 重定义;以前的定义是“函数”

【C++入门到精通】 C++入门—命名空间_作用域

命名空间的定义

        定义命名空间,需要使用到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
}

【C++入门到精通】 C++入门—命名空间_作用域_02

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

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

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++入门到精通】 C++入门—命名空间_作用域_03

命名空间可以嵌套定义

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++入门到精通】 C++入门—命名空间_程序设计语言_04

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

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++入门到精通】 C++入门—命名空间_程序设计语言_05

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

        在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();
}

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

无名命名空间

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

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

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

命名空间的使用

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

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

使用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++入门—命名空间_作用域_09

总结

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


 


标签:精通,入门,int,namespace,C++,C语言,空间,命名
From: https://blog.51cto.com/u_16531685/9345776

相关文章

  • HTML入门
    #HTML入门HTML基础超文本标记语言(HyperTextMarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言。HTML-----用来描述网页的一种语言```<head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"......
  • ClickHouse入门
    简介:ClickHouse是俄罗斯Yandex公司使用C++语言编写开源的列式存储数据库,主要用于在线分析查询(OLAP),使用SQL查询实时生成分析数据报告。一、安装 二、入门1. 特点A.列式存储:较MySQL行式存储有利于列的聚合、计数等操作,针对每列可选择最优的数据压缩算法来压缩......
  • 洛谷入门赛 #19 题解
    比赛传送门A-分饼干I将三盒饼干按数量排序。若较小的两盒饼干数之和大于另一盒饼干,则将较小的两盒饼干奖励给第一名,另一盒奖励给第二名;若较大的一盒饼干数大于另外两盒之和,则将较大的一盒奖励给第一名,另外两盒奖励给第二名。B-分饼干II每个人分到的饼干数都不同,即可以看......
  • C++常见面试题整理
    1.CPP编译链接过程1.CPP编译链接过程预处理处理以#开头的命令,纯文本替换,类型不安全#pragmalib和#pragmalink除外,#pragmalib用于指定要链接的库,#pragmalink用于指定程序入口(默认入口是main函数,但可以通过该命令修改)都是在链接阶段进行处理编译词法分析,语法分析,......
  • C++11原子变量:线程安全、无锁操作的实例解析
     在C++11中,原子变量(std::atomic)提供了一种线程安全的方式来操作共享变量。下面是一个简单的例子,演示了C++11原子变量的用法。#include<iostream>#include<atomic>#include<thread>std::atomic<int>counter(0);//声明一个原子整数变量voidincrementCounter(int......
  • C++ opencv计算两个cv::Rect的重复面积
    C++ opencv计算两个cv::Rect的重复面积  #include<opencv2/opencv.hpp>#include<iostream>intmain(){//创建两个矩形cv::Rectrect1(10,10,50,50);//(x,y,width,height)cv::Rectrect2(30,30,50,50);//检查两个矩形是否重叠......
  • c++函数默认参数及占位参数
    一.函数默认参数在c++中,函数形参列表中的形参是可以有默认值的语法:如果我们自己传入数据,就用自己的数据,如果没有,就用默认值注意:1.如果某个位置参数有默认值,那么从这个位置往后,从左往右,必须都要有默认值2.如果函数声明有默认值,函数实现的时候就不能有默认参数。(声明和实现只......
  • c++引用
    一.引用的基本使用作用:给变量起别名语法:数据类型&别名=原名二.引用注意事项引用必须初始化引用在初始化后,不可以改变三.引用做函数参数作用:函数传参时,可以利用引用技术让形参修饰实参优点:可以简化指针修饰实参四.引用做函数返回值注意:1.不要返回局部变量的引用......
  • 浅谈C++简单前缀和实现
    浅谈前缀和2023.9.28\(tips:\)文章持续更新中,欢迎关注\(upd:\)文章从洛谷博客迁移至博客园(\(2024.1.19\))洛谷B3612【深进1.例1】求区间和题目大E:有一个内部元素个数为\(n\)的数组\(a\),现在有m次询问,求a[l]到a[r]之间所有元素的和朴素的做法:#include<iostream>usin......
  • C++-类和对象(1)
    引言:C++语言兼容C语言的基础上,更多的是面向对象进行编程,即相较于事务处理的流程,更侧重于处理过程中涉及到的类以及对象。今天向大家分享C++中的类与对象相关知识。1.类的定义:常使用class关键字定义一个类:由两部分构成,分别是成员属性和成员函数。classclassName//类名{//成员......