我在使用 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; };
最佳答案
您对构造函数有一些误解。尽管出现,foo w=0x12345678;
不包含对赋值运算符的任何调用。它是复制初始化,并且(大部分)等同于:
foo w{foo{0x12345678}};
这不应该编译,因为 foo
没有采用 int
参数的构造函数。
我说“大部分”是因为 foo w=0x12345678;
需要存在从 int
到 foo
(或子类)的隐式转换foo
), 其中foo w{foo{0x12345678}};
涉及显式转换,永远不会构造foo
的子类。
关于c++ - 类构造函数和对象实例化/初始化 C++/GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429331/