类构造函数和对象instanciation / initialisation C ++ / GCC

时间:2012-11-17 09:30:09

标签: c++ class gcc constructor

我使用GCC在C ++类构造函数中遇到了麻烦。

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

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

foo w=0x12345678; //  case 1

foo w ;           //  case 2 init ( 2 steps)
    w=0x12345678;

对我而言,案例2正在发挥作用 GCC调用foo()(构造函数1)然后调用=运算符。最后,w.m_val没问题 但是对于案例1,GCC直接调用foo(long *)(构造函数2),而不是其他任何东西。显然这不是我所期待的。

如果“foo”中的char,int或long,则两种情况的结果都相同。

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

感谢。

class foo
{
    public:
        foo(){ // constructor 1 
          m_val=0;
          m_ptr=NULL;
          };

        foo(long *p){ // constructor 2, should never be called!!!
          m_val=0;
          m_ptr=p;
        };
        friend foo  operator+( const foo &rhs, const unsigned int v );

        foo &operator+= (unsigned int v )
        {
            m_val+=v;
            return *this;
        }

        ~foo(){};

         foo &operator= ( const foo &rhs )
         {
            m_val=rhs.m_val;
            return *this;
         };
         foo &operator= ( const unsigned int v )
         {
            m_val=v;
            return *this;
         };

    private:
        unsigned int m_val;
        long *m_ptr;
};

1 个答案:

答案 0 :(得分:3)

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

foo w{foo{0x12345678}};

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

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