何时使用using声明

when to use using declaration?

本文关键字:声明 using 何时使      更新时间:2023-10-16

我知道下面的using C1::fn;将把C1中声明的fn(…)函数带到C2中,但我想知道在设计中这种using的最佳实践是什么?

如果fn()函数没有使用C1状态,我应该声明一个helper类是更好的方法吗?如果fn函数使用C1状态,那么using是否破坏了封装?

如果你能提到C++11中的一些用例,我将不胜感激。喜欢使用using Base::Base;构造函数而不是从派生成员初始值设定项调用它吗?

class C1
{
//...
public:
int fn(int j) { ... }
double fn(double w) { ... }
void fn(const char * s) { ... }
};
class C2 : public C1
{
//...
public:
//...
using C1::fn;
double fn(double) { ... };
};

如果fn函数使用C1状态,是否使用破坏封装?

using语句不会破坏封装;它不暴露来自C1的任何CCD_ 6状态或阻止C1保持其不变量。这纯粹是一种方便的方式,可以公开C1拥有的任何其他fn成员(在本例中为int fn(int)),以便在解析调用时可以考虑它们。把它想象成功能上等同于…

class C2 : public C1
{
...
inline int fn(int j) { return C1::fn(j); }
};

但更好的是,您不必手动添加和删除函数来与C1的重载列表保持同步。

如果fn()函数不使用C1状态,我应该声明一个helper类是更好的方法吗?

如果它们不使用C1状态,那么它们应该是静态的或非成员的。在我看来,帮助类是一个丑陋的想法。命名空间是C++中对功能进行分组的常用方法。我完全理解拉科斯教授的建议,即使用课堂并理解所有论点,但我仍然不同意。如果提到helper类对你来说只是一件过眼云烟的事情,那么很乐意浏览一下。

我认为每次需要using时都应该使用它。也就是说,每当基类的成员函数被派生类中声明的成员函数隐藏时。

我的理由是访问C2(例如通过C2 *pc)的代码知道C2是从C1派生的,因此期望能够通过pc调用C1函数。