C++ 命名空间,作用域运算符和using关键字

2021/6/11 12:22:34

本文主要是介绍C++ 命名空间,作用域运算符和using关键字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

C++ 命名空间,作用域运算符和using关键字

个人理解,极其主观,仅供参考!

C++ 作用域运算符

C++的作用域运算符主要起到区别作用,避免产生二义性,在不同的模块可能有相同的标识符名称,需要用::加以区分。

主要用于:

  1. 命名空间
  2. 全局变量
  3. 类(static情况,继承情况)

见文章:C++作用域运算符::的用法 (360doc.com)

C++ 命名空间

使用命名空间实际上也是避免不同的空间内的标识符相同导致二义性,可以通过使用作用域运算符确定此标识符处于什么空间,也可以使用using namesapce s_name 声明以下的语句都处于s_name的作用域中。

作用域可以嵌套,可以在一个作用域里定义另一个作用域。

注意namespace内的变量是静态生命周期。

namespace Hs
{
	int i = 10;
	int j = 25;
	namespace HD
	{
		int k = 13;
	}
}
void testNS()
{
	using namespace Hs;
	cout << &HD::k << endl;
}

输出:

00A81050

定义了命名空间,实际上就分配内存了。

注意只能在全局作用域定义命名空间。

C++ using

using 是C++的一个关键字,主要用在以下地方:

命名空间

可以通过 using namesapce s_name 表明作用域内的代码中的标识符在s_name命名空间。

那么作用域怎么定呢?

namespace HU
{
	int i = 5;
	int j = 15;
}
namespace Hs
{
	int i = 10;
	int j = 25;
}
void testNS()
{
	using namespace HU;
	cout << i << endl;
	using namespace Hs;
	//cout << i << endl; // 这里提示错误,i不明确,因为这个作用域的位置包含了两个命名空间内的i标识符
	cout << Hs::i << endl;
}
int main()
{
	//cout << i << endl;//这里也报错,因为当前的命名空间(也就是std)并不存在i标识符
	testNS();
	return 0;
}

输出:

5

10

因此,using namesapce s_name的作用域和普通的全局变量和局部变量相同。若声明在全局,则作用域在全局,若声明在局部,则作用域在局部。注意不能在类中使用using namesapce s_name。

子类私有继承父类的公有函数

用的比较少,主要是图个方便,其实也可以通过封装一个函数接口来调用

class C_a
{
public:
	void f1()
	{
		cout << "A : f1" << endl;
	}
private:
	void f2()
	{
		cout << "A : f2" << endl;
	}
};
class C_b : private C_a
{
public:
	using C_a::f1;//这里就是将私有的函数显式了,但基类也必须是public的才行
	void f4()
	{
		this->f3();
	}
private:
	void f3()
	{
		cout << "B : f3" << endl;
	}

};
void testUCls()
{
	C_b cb;
	cb.f1();
	cb.f4();
}

起别名

见文章C++11使用using定义别名(替代typedef) (biancheng.net)

为函数定义别名:

typedef void (*func_t)(int, int);
using func_t = void (*)(int, int);

为某个类型定义别名:

typedef unsigned int u_t;
using u_t = unsigned int;

为了弥补typedef的缺陷,可以用于为一个模板类起别名:

template<typename T>
using unMp = unordered_map<int,T>;
unMp<int> mp;

template<typename T1,typename T2>
using unXMp = unordered_map<T1, T2>;
unXMp<int, string> mxmp;

同样,用于为模板函数起别名:

template<typename T>
using fun_t = void (*)(T, T);

template<typename T>
void Ffc(T a, T b)
{
	cout << a + b << endl;
}

void Ffd(string a, string b)
{
	cout << a + b << endl;
}

void testUsi()
{
	fun_t<int> fs1 = Ffc<int>;
	(*fs1)(10, 20);
	fun_t<string> fs2 = Ffd;
	(*fs2)("hello ", "world");
}


这篇关于C++ 命名空间,作用域运算符和using关键字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程