我使用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; };
答案 0 :(得分:3)
你误解了有关构造函数的东西。尽管出现了foo w=0x12345678;
,但它不包含对赋值运算符的任何调用。它是复制初始化,并且(大部分)等同于:
foo w{foo{0x12345678}};
这不应该编译,因为foo
没有带int
参数的构造函数。
我说“大部分”因为foo w=0x12345678;
要求存在从int
到foo
(或foo
的子类)的隐式转换,其中foo w{foo{0x12345678}};
涉及显式转换,永远不会构造foo
的子类。