问一个C++构造函数的问题

daidodo 2009-12-21 06:13:17
看gcc 4.3的源码,到 __normal_iterator 有这么一段:

  template<typename _Iterator, typename _Container>
class __normal_iterator
{
protected:
_Iterator _M_current;
...
__normal_iterator() : _M_current(_Iterator()) { }
...
};


问题:
为什么构造函数里,先生成一个 _Iterator() 临时对象,再给 _M_current 进行拷贝构造;
而不是直接调用 _M_current 的默认构造函数?

BTW:好像stl里有多处这种做法,如果说是“无意义”的,有点底气不足。。。
...全文
344 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
syj2008cn2003 2009-12-26
  • 打赏
  • 举报
回复
学习了。。。
daidodo 2009-12-26
  • 打赏
  • 举报
回复
顶起来
xue785920414 2009-12-24
  • 打赏
  • 举报
回复
不懂,帮顶一下,期待高手解决
forster 2009-12-24
  • 打赏
  • 举报
回复
保证在大括号之前被调用
继承方便吧
ypb362148418 2009-12-24
  • 打赏
  • 举报
回复
这样就有了默认值了,因为先构造的那个对象有默认值,这样就很容易初始化了
daidodo 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wingforce 的回复:]
也许是担心有的编译器在iterator是指针或者别的什么东西的时候,
__normal_iterator() : _M_current() { }
无法编译通过

纯粹怀疑,这个东东的作用不是:
Its primary purpose is to convert an iterator that is not a class, e.g. a pointer, into an iterator that is a class.

[/Quote]
好像有点道理,不知道有没有这些编译器的列表。

现在要写类库,不得不注意这些编译器细节。
daidodo 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 we_sky2008 的回复:]
引用 1 楼 pengzhixi 的回复:
你调用默认构造函数构造一个对象,然后再赋值给_M_current?你不觉得这样更麻烦?


我觉得可以不显示指定成员对象的缺省构造函数,像下面一样,效果是一样的:

C/C++ code  template <typename _Iterator, typename _Container>
    class __normal_iterator
    {
    protected:
      _Iterator _M_current;
...
      __normal_iterator(){ }
...
};

[/Quote]

这样的话,当_M_current是POD时,值是没有初始化的;相反,如果使用了 _M_current() 初始化列表,POD的值会进行初始化,一般为0。
IT_lau 2009-12-22
  • 打赏
  • 举报
回复
mark
go_Michael 2009-12-22
  • 打赏
  • 举报
回复
mark

坐等高手
taodm 2009-12-22
  • 打赏
  • 举报
回复
有些东西是为了应付各种诡异的编译器"bug"的。
除非是gcc的开发人员,几乎没啥其他人能告诉你真正的“答案”。
不要深究。
chenyu2202863 2009-12-22
  • 打赏
  • 举报
回复
楼主贴出的代码会导致_Iterator(const _Iterator &)调用
we_sky2008 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
你调用默认构造函数构造一个对象,然后再赋值给_M_current?你不觉得这样更麻烦?
[/Quote]

我觉得可以不显示指定成员对象的缺省构造函数,像下面一样,效果是一样的:

C/C++ code template <typename _Iterator, typename _Container>
class __normal_iterator
{
protected:
_Iterator _M_current;
...
__normal_iterator(){ }
...
};
WingForce 2009-12-22
  • 打赏
  • 举报
回复
也许是担心有的编译器在iterator是指针或者别的什么东西的时候,
__normal_iterator() : _M_current() { }
无法编译通过

纯粹怀疑,这个东东的作用不是:
Its primary purpose is to convert an iterator that is not a class, e.g. a pointer, into an iterator that is a class.
ohxf1234 2009-12-22
  • 打赏
  • 举报
回复
C/C++ code template<typename _Iterator, typename _Container>
class __normal_iterator
{
protected:
_Iterator _M_current;
...
__normal_iterator() : _M_current(_Iterator()) { }
...
};



问题:
为什么构造函数里,先生成一个 _Iterator() 临时对象,再给 _M_current 进行拷贝构造;
而不是直接调用 _M_current 的默认构造函数?

我觉得:
1)模板形参不是引用类型,所以在实例化的过程中要生成中间临时变量,以传递值。
2)_M_current(_Iterator()) 有可能他的构造函数是explicit。
ropert911 2009-12-22
  • 打赏
  • 举报
回复
学习哈
dskit 2009-12-21
  • 打赏
  • 举报
回复
1. 某些对象只能使用初始化列表初始化,如const, 引用。
2. 这里初始化成员_M_current。
3. "直接调用 _M_current 的默认构造函数", 怎么调用?在什么地方调用?
howlet2 2009-12-21
  • 打赏
  • 举报
回复
想不通就说明还用不到,等需要用到的时候想
macrojj 2009-12-21
  • 打赏
  • 举报
回复
好奇。。。
这样的话 何必再初始化列表做呢。。
healer_kx 2009-12-21
  • 打赏
  • 举报
回复
呵呵,可能只是为了重载而已。
lin_style 2009-12-21
  • 打赏
  • 举报
回复
_Iterator()构造函数-> _M_current拷贝函数-> _M_current构造函数 ??过程是这样的吧,不确定,很少这样写。

可以大概推出,第一个_Iterator()构造函数是产生了以个什么东西给_M_current, 防止_M_current在构造函数中生成。
是本身的对象吗?肯定不是,_Iterator()只是个临时的。
初始化之类的?貌似有可能,用于共享一部分指定数据区的可能,防止多个_Iterator()对象对于特定数据区域的影响。

以上都是推测,无根据,无结果,无出处。三无。
加载更多回复(2)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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