我在实现中有关显式函数的问题,接口文件是C ++。让我用一个例子解释一下。
接口文件:
#ifndef IntCell_H
#define IntCell_H
class IntCell{
public:
explicit IntCell(int initialValue =0);
int read() const;
void write( int x );
private:
int storedValue;
};
#endif
实施档案:
#include "IntCell3.h"
IntCell::IntCell(int initialValue)
:storedValue(initialValue) {}
int IntCell::read() const
{ return storedValue; }
void IntCell::write( int x )
{ storedValue = x ;}
在编写这些代码时,签名必须与我们在read函数中看到的完全匹配(两者都是访问器)。我很好,但问题是为什么我不能写
IntCell::explicit IntCell(int initialValue)
在实施文件中?是什么原因导致我无法添加" explicit"到这条线? 提前谢谢。
答案 0 :(得分:3)
因为那些是规则。您只将explicit
放在声明(标题)中。原因是因为只有通过声明才能在其他翻译单元中看到实现。因此,如果声明未在标题中标记为explicit
,则其他翻译单元无法“知道”该功能已标记为explicit
。并且因为在实现文件中放置explicit
没有意义,所以该语言的设计者决定它只应该在声明中使用。另一个原因是清晰度:为什么在允许声明已经足够复杂的语言中添加另一个无用的符号语法,例如:
void (*signal(int, void (*fp)(int)))(int);
答案 1 :(得分:0)
原因是明确的需求无法匹配。它禁止某种行为导致只有一种版本的方法。
头文件用于通信接口。在模板日之前,通常只发送标头和库文件。实施是隐藏的。
如果您的建议是可能的,那么也可以将构造函数重新定义为在另一个编译单元中不显式,并且不允许预期的行为,即通过隐式转换来限制构造。
您不能将构造函数定义为显式而非显式。因为你定义后者的那一刻,前者将变得无效。
例如
explicit constructor( int );
constructor( int )
这是无效的,因为编译器可以执行第二次隐式转换。因此,第一个是荒谬的。
与const函数相比,你可以提供两个原型而没有任何问题,因为编译器可以拾取你的对象被const访问的情况并使用const版本,而在另一种情况下它将使用非const。这两个案例是不相交的。
void myfun() const;
void myfun();
是有效代码。