简介
using 声明将名称引入声明性区域,其中显示了 using 声明。
语法
using [typename] nested-name-specifier unqualified-id ;
using declarator-list ;
parameters
嵌套名称说明符 命名空间、类或枚举名称以及范围解析运算符序列 (:: ) ,由范围解析运算符终止。 单个范围解析运算符可用于引入全局命名空间的名称。 关键字 typename 是可选的,可用于在从基类引入类模板时解析依赖名称。
非限定 id 非限定 id 表达式,可以是标识符、重载运算符名称、用户定义的文本运算符或转换函数名称、类析构函数名称或模板名称和参数列表。
声明符-列表 以逗号分隔的列表,其中列出了 [ typename ] 嵌套名称说明符 非 限定标识符 ,后面跟有省略号。
备注
使用声明会将非限定名称引入到在其他位置声明的实体的同义词。 它允许使用特定命名空间中的单个名称,而无需在其出现的声明区域中进行显式限定。 这与 using 指令相反,后者允许使用命名空间中的 所有 名称而无需进行限定。 using 关键字还用于 类型别名。
示例: using 类字段中的声明
使用声明可在类定义中使用。
#include <stdio.h>
class B {
public:
void f(char) {
printf_s("In B::f()\n");
}
void g(char) {
printf_s("In B::g()\n");
}
};
class D : B {
public:
using B::f;
using B::g;
void f(int) {
printf_s("In D::f()\n");
f('c');
}
void g(int) {
printf_s("In D::g()\n");
g('c');
}
};
int main() {
D myD;
myD.f(1);
myD.g('a');
}
Output
In D::f()
In B::f()
In B::g()
示例:声明 using 成员的声明
用于声明成员时,using 声明必须引用基类的成员。
#include <stdio.h>
class B {
public:
void f(char) {
printf_s("In B::f()\n");
}
void g(char) {
printf_s("In B::g()\n");
}
};
class C {
public:
int g();
};
class D2 : public B {
public:
using B::f;
};
int main() {
D2 MyD2;
MyD2.f('a');
}
Output
复制 In B::f()
示例: using 具有显式限定的声明
使用 using 声明声明的成员可以通过使用显式限定来引用。 ::前缀引用全局命名空间。
#include <stdio.h>
void f() {
printf_s("In f\n");
}
namespace A {
void g() {
printf_s("In A::g\n");
}
}
namespace X {
using ::f;
using A::g;
}
void h() {
printf_s("In h\n");
X::f();
X::g();
}
int main() {
h();
}
Output
In h
In f
In A::g
示例: using 声明同义词和别名
当使用声明时,由声明创建的同义词只引用在使用声明点有效的定义。 在 using 声明后面添加到命名空间的定义是无效同义词。
声明定义的名称 using 是其原始名称的别名。 它不会影响原始声明的类型、链接或其他特性。
namespace A {
void f(int) {}
}
using A::f;
namespace A {
void f(char) {}
}
void f() {
f('a');
}
void b() {
using A::f;
f('a');
}
示例:局部声明和 using 声明
对于命名空间中的函数,如果声明区域中提供了一组本地声明和使用单个名称的声明,则它们必须引用同一实体,或者它们必须都引用函数。
namespace B {
int i;
void f(int);
void f(double);
}
void g() {
int i;
using B::i;
void f(char);
using B::f;
}
在上面的示例中, using B::i 语句导致第二个 int i 在函数中声明 g() 。 using B::f语句不与函数冲突, f(char) 因为引入的函数名称 B::f 具有不同的参数类型。
示例:局部函数声明和 using 声明
局部函数声明不能与使用声明引入的函数具有相同的名称和类型。 例如:
namespace B {
void f(int);
void f(double);
}
namespace C {
void f(int);
void f(double);
void f(char);
}
void h() {
using B::f;
using C::f;
f('h');
f(1);
void f(int);
}
示例: using 声明和继承
就继承而言,当 using 声明将基类中的名称引入派生类作用域时,派生类中的成员函数会重写基类中具有相同名称和参数类型的虚拟成员函数。
#include <stdio.h>
struct B {
virtual void f(int) {
printf_s("In B::f(int)\n");
}
virtual void f(char) {
printf_s("In B::f(char)\n");
}
void g(int) {
printf_s("In B::g\n");
}
void h(int);
};
struct D : B {
using B::f;
void f(int) {
printf_s("In D::f(int)\n");
}
using B::g;
void g(char) {
printf_s("In D::g(char)\n");
}
using B::h;
void h(int) {}
};
void f(D* pd) {
pd->f(1);
pd->f('a');
pd->g(1);
pd->g('a');
}
int main() {
D * myd = new D();
f(myd);
}
Output
In D::f(int)
In B::f(char)
In B::g
In D::g(char)
示例: using 声明可访问性
使用声明中提到的名称的所有实例都必须是可访问的。 特别是,如果派生类使用 using 声明访问基类的成员,则该成员名称必须是可访问的。 如果名称是重载成员函数的名称,则所有名为的函数都必须是可访问的。
class A {
private:
void f(char);
public:
void f(int);
protected:
void g();
};
class B : public A {
using A::f;
public:
using A::g;
};
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.csdn.net/it_cplusplus/article/details/118501122
|