关于explicit

bullet2003 2003-04-15 02:35:52
请看以下这段代码
template <class itemType>
class tvector
{
public:

tvector( );
explicit tvector( int size );
tvector( int size, const itemType & fillValue );
tvector( const tvector & vec );
~tvector( );

其中explicit是什么用法?
而且在tvector( const tvector & vec );中tvector是一个还没有定义完整的类,
怎么可以这样“递归”定义?
...全文
20 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
那不是递归……
你没有看见是引用吗?在编译阶段编译器知道VEC是个引用就够了,他不会追究你到底明确定义了没有,和完了。
RouteSim 2003-04-15
  • 打赏
  • 举报
回复
同意楼上的兄弟,补充一下:
防止隐式的类型转化
比如:
class aaa{
aaa(int i){ }
};
aaa b=3; //3 为int类型,通过构造函数aaa(int i)将int类型隐式转化为class aaa类型。
故可编译通过,加上explicit以后隐式的转化被禁止。
class aaa
{
explicit aaa(int i)
{
}
};
aaa b=3;则编译不过去。//加上explicit以后隐式的转化被禁止,但显式的转化仍然可以,如:
aaa c(3) //通过构造函数aaa(int i) 将对象c初始化。
mubaosen 2003-04-15
  • 打赏
  • 举报
回复
防止构造对象的过程中隐式的类型转化。比如:
class aaa
{
aaa(int i)
{
}
};
aaa b=3;
也可以被编译通过,并自动调用aaa(int)构造函数。explicit关键字就是要防止这一点。
class aaa
{
explicit aaa(int i)
{
}
};
aaa b=3;则编译不过去。
bullet2003 2003-04-15
  • 打赏
  • 举报
回复
在tvector( const tvector & vec );中tvector是一个还没有定义完整的类,
怎么可以这样“递归”定义?
darkhawk 2003-04-15
  • 打赏
  • 举报
回复
这是为了防止进行自动类型转换而定义的一种语法.
有时编译器会根据类的构造函数的参数进行自动类型转换,如
class A
{
public:
A(int x)//构造函数
{
}
};
假定另外有一个函数,void f(A a);
那么通过如下语句进行构造的时候
f(5)
将通过int 型的5自动生成一个A对象传递给f函数,而将构造函数加上explicit后就会禁止这种情况
积木 2003-04-15
  • 打赏
  • 举报
回复
所谓的显示调用构造函数是为了防治不必要的隐式转换,以求数据的安全性
whhif 2003-04-15
  • 打赏
  • 举报
回复
说明这个类不能隐式调用构造函数
就是说
tvector a
tvector b=a;这样的隐式调用构造函数是不允许的.

只能 tvector b(size);调用才行.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧