首页 > 编程语言 >C++基础1: 命名空间

C++基础1: 命名空间

时间:2023-04-18 14:26:50浏览次数:35  
标签:test1 rand int namespace C++ 空间 命名

0. 前言

C++是在C语言基础之上的一门语言, 所以学习C++的第一步是思考C++是如何优化C语言设计中的一些不足, 如作用域, IO , 函数, 指针, 宏等

这些内容同时也是为之后学习C++类和对象打基础, 下面说一下C++是如何优化C语言中的作用域

1. 命名空间

在说明命名空间的概念和如何优化C作用域之前, 首先来看一个例子

如图, 编译器报rand重定义错误, 发生这个错误的原因是<stdlib.h>头文件中有一个名为rand的函数

当它包含进t1.cpp源文件后, 它与变量rand发生命名冲突,如下图

这个命名冲突在C语言中是没有办法解决的,因为在C语言中只有局部和全局作用域的概念

而在局部作用域中创建的变量出了作用域后就会被销毁, 所以也不能解决问题

#include <stdio.h>
#include <stdlib.h>
void test()
{
	int rand = 0;
} // 变量rand销毁 
int main()
{
	printf("%d ", rand);
}

 但是命名冲突在C++中可以用命名空间来解决

 

1.1 命名空间的概念

命名空间可以理解为一个域,这个域叫做命名空间域, 命名空间域与其他不同的域分离, 以此解决命名冲突的问题, 如下图

此时变量rand在命名空间域中,  此时它与函数名rand在不同的域中,不同的域可以有相同的名字,所以这样就解决了命名冲突 

下面用实际代码证明

#include <stdio.h>
#include <stdlib.h>

// 命名空间的定义
namespace test
{
	int rand = 0;
}

int main()
{
	printf("%d\n", test::rand); // 命名空间的使用
}

如图所示, 打印出了变量rand的值, 解决了命名冲突 ,接下来详细说一下命名空间的定义与使用

 

1.2 命名空间的定义

1. 命名空间定义的语法:

关键字namespace+命名空间名字+{}

namespace test
{
	int rand = 0;
}

2. 命名空间定义的规则:

  • 命名空间内部可以定义变量, 函数和结构
namespace test1
{
	// 命名空间内可以定义变量, 函数和结构
	int rand = 0;

	int add(int x, int y)
	{
		return x + y;
	}

	struct SLNode
	{
		int data;
		struct SLNode* next;
	};
}
  • 命名空间可以嵌套命名空间
namespace test1
{
	int rand = 0;

	// 命名空间可以嵌套命名空间
	namespace test2
	{
		int a = 1;
		int sub(int x, int y)
		{
			return x - y;
		}
	}
}

 

1.3 命名空间的使用

命名空间有三种使用方式

1. 指定命名空间域:

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

int main()
{
	// 1. 指定命名空间域 --- 命名空间名字 + 作用域限定符 + 命名空间成员
	printf("%d\n", test1::a);
	printf("%d\n", test1::test2::b);

}

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

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

// 2. 使用using将命名空间中某个成员引入
using test1::a;
using test1::test2::b;

int main()
{
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

3. 使用using namespace 命名空间名引入

#include <stdio.h>

namespace test1
{
	int a = 0;
	int c = 2;
	namespace test2
	{
		int b = 1;
	}
}

// 3. 使用using namespace 命名空间名引入
using namespace test1;

int main()
{
	printf("%d\n", a);
	return 0;
}

 

1.4 关于命名空间的思考

1. 命名空间域默认是关闭的, 只有如上的3种方法使用命名空间域

2. 所有的C++头文件和STL都封在一个名为std命名空间域中

 

如图所示, 只有将命名空间域std引入到全局域中, 才能使用iostream头文件, 这样是为了防止C++标准库与我们自己写的代码之间出现命名冲突

标签:test1,rand,int,namespace,C++,空间,命名
From: https://www.cnblogs.com/xumu11291/p/17329204.html

相关文章

  • sysaux表空间异常增长之统计信息数据未自动清理
    首先还是去查sysaux表空间中占用空间最多的组件和对象selectOCCUPANT_NAME,OCCUPANT_DESC,SPACE_USAGE_KBYTES/1024USAGE_MBfromV$SYSAUX_OCCUPANTSorderbySPACE_USAGE_KBYTESdesc;SELECTD.SEGMENT_NAME,D.SEGMENT_TYPE,SUM(BYTES)/1024/1024SIZE_MBFROMDBA_SEGME......
  • Oracle审计篇 —— 审计数据表空间迁移及定期数据清理设置
    以下内容测试版本为oracle19c,其他版本可能会略有不同。最好是在创建数据库之后就进行设置,审计数据越多迁移会越麻烦,还可能影响业务。 编号需求项需求细节内容说明准备工作1检查是否打开审计showparameterauditaudit_trail为NONE则未开启2检查审计表现在所在表空间SELECTtable_......
  • C++重载的奥义之运算符重载
    0、引言        重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。        正如在之前的文章《重载的奥义之函数重载》中介绍的类似,函数的重载是指利......
  • 初学者代码训练Day2(c/c++)
    题目接收两个双精度浮点型数据 a 和 b。输出一个浮点数表示两数相加的结果。(结果保留两位小数)要求:创建两个浮点型变量 a,b。创建两个浮点型指针变量 pa,pb 并分别将其储存的地址设为 a 的地址和 b 的地址。不要使用 a+=b 而是通过指针将变量 b 的值加到变量......
  • 什么是空间复杂度
    原文点此跳转什么是空间复杂度?算法在运行过程中临时占用存储空间大小的度量,和时间复杂度表示一样,一个函数,用大O表示,例如O(1)、O(n)、O(^2)...基础案例O(1)这段代码因为只声明了单个变量,单个变量所占用的内存永远是1。leti=0i+=1O(n)这段代码主要声明了变量list和......
  • 4/17c++练习打卡
    #include<iostream>usingnamespacestd;classCounter{friendCounter&operator+(constCounter&a,constCounter&b);intnum;public:Counter(){num=0;}Counter(intnum_):num(num_){}//Counteroperator+......
  • 打卡 pta c++ 汽车收费
    现在要开发一个系统,管理对多种汽车的收费工作。给出下面的一个基类框架classVehicle{protected:stringNO;public:Vehicle(stringn){NO=n;}virtualintfee()=0;//计算应收费用};以Vehicle为基类,构建出Car、Truck和Bus三个类。Car的收费公式为:载客数*8+重量*2......
  • C++课本第三章课后习题 3-8
    编写函数将华氏度转化为摄氏度#include<iostream>usingnamespacestd;doublefun(doublex){return5.0*(x-32)/9;}intmain(){doublea;cin>>a;cout<<fun(a)<<endl;}编写一个函数判别一个数,是不是质数,在主程序完成输入输出。#include<iostre......
  • c/c++零基础坐牢第三天
    c/c++从入门到入土(3)开始时间2023-04-17 19:07:20结束时间2023-04-17 20:53:40前言:经过三天的算法训练,大家肯定对后面的编程知识产生浓厚的兴趣,有了前两章的知识铺垫,我们今天来学习一下如何从键盘输入和屏幕输出!以下是自制思维导图参考于苏小红C语言程序设计(第四版): 作业三......
  • C++重载的奥义之运算符重载
    0、引言        重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。        正如在之前的文章《重载的奥义之函数重载》中介绍的类似,函数的重载是指利......