【问题标题】:class constructor and object instanciation/initialisation C++/GCC类构造函数和对象实例化/初始化 C++/GCC
【发布时间】:2012-11-05 22:19:56
【问题描述】:

我在使用 GCC 的 C++ 类构造函数方面遇到问题。

下面的“foo”类应该模拟像 AL、AH、AX、EAX 等处理器寄存器,我需要一些与该类相关的基本算术。 但我在初始化或“foo”对象中有一个奇怪的行为。

对于以下两种情况,我没有相同的结果:

富 w=0x12345678; // 情况1 富 w ; // 案例 2 初始化(2 步) w=0x12345678;

对我来说,案例 2 有效 GCC 调用 foo() (构造函数 1),然后调用 = 运算符。最后, w.m_val 就可以了 但是对于案例 1,GCC 直接调用 foo(long *) (构造函数 2),仅此而已。显然这不是我所期待的。

如果 "foo" 在 char 、 int 或 long 中,则两种情况的结果相同。

我可能对构造函数有误解或做错了什么。有人可以帮我吗?

谢谢。

类 foo { 民众: foo(){ // 构造函数 1 m_val=0; m_ptr=NULL; }; foo(long *p){ // 构造函数 2,永远不应该被调用!!! m_val=0; m_ptr=p; }; 朋友 foo 运算符+( const foo &rhs, const unsigned int v ); foo &operator+= (unsigned int v) { m_val+=v; 返回*这个; } ~foo(){}; foo &operator= ( const foo &rhs ) { m_val=rhs.m_val; 返回*这个; }; foo &operator= ( const unsigned int v ) { m_val=v; 返回*这个; }; 私人的: 无符号整数 m_val; 长 *m_ptr; };

【问题讨论】:

  • 问题不在发布的代码中(我写这篇文章时)。发布一个完整的、最小的例子来展示这个问题。
  • 我在不同的编译器 (Visual Studio 2010) 上尝试了您的代码,但在 foo w=0x12345678; 行出现编译器错误,这是我所期望的。所以要么你发现了一个编译器错误(不太可能但并非不可能),要么你没有发布你的真实代码。

标签: c++ class gcc constructor


【解决方案1】:

您对构造函数有误解。尽管看起来,foo w=0x12345678; 不包含对赋值运算符的任何调用。它是复制初始化,并且(大部分)等同于:

foo w{foo{0x12345678}};

这不应该编译,因为foo 没有采用int 参数的构造函数。

我说“大部分”是因为foo w=0x12345678; 需要存在从intfoo(或foo 的子类)的隐式转换,其中foo w{foo{0x12345678}}; 涉及显式转换,并且永远不会构造foo 的子类。

【讨论】:

  • foo 有第二个构造函数 foo(long *) 并且这个 ctor 在 foo 中被调用 w=0x0123456;
  • @spamy:您使用的是什么编译器版本/选项?对我来说,gcc 会在该行产生一个关于无效转换的致命错误。这正是我所期望的。
  • 在这种情况下,您的编译器有错误。 0x0123456int,int 没有办法隐式成为指针。
  • 好的,但在可能的情况下,foo 的对象只是单个对象或属于父对象的对象。这就是为什么有 2 个构造函数。所以我必须通过 foo w(&parent_object)=0x12345678 或 foo w=0x12345678; 创建但无论哪种情况,0x124678 都应该是地址。
  • @spamy 如果您发布一个有您所描述问题的完整的小程序,这会有所帮助。此外,由于可能存在编译器错误,因此您正在使用的版本号和编译器选项。
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2021-11-06
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多