4

我在使用 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;
};

4

1 回答 1

3

您对构造函数有误解。尽管出现,foo w=0x12345678;但不包含对赋值运算符的任何调用。它是copy-initialization,并且(大部分)等同于:

foo w{foo{0x12345678}};

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

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

于 2012-11-17T09:38:26.383 回答