类构造函数和对象实例化/初始化C++/海湾合作委员会 我使用C++类构造函数遇到麻烦,使用GCC .
下面的类“foo”应该模拟处理器寄存器,如AL、AH、AX、EAX等,。。。我需要一些与这门课相关的基本算术。 但我在初始化或“foo”对象时有一种奇怪的行为 对于以下两种情况,我没有相同的结果: foo w=0x12345678; // case 1 foo w ; // case 2 init ( 2 steps) w=0x12345678; foo w=0x12345678;//案例1 foo w;//案例2初始(2个步骤) 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(){//构造函数1 m_val=0; m_ptr=NULL; }; foo(long*p){//构造函数2,永远不应该被调用!!! m_val=0; m_ptr=p; }; 友元foo运算符+(常量foo&rhs,常量unsigned int v); foo运算符+=(无符号整数v) { m_val+=v; 归还*这个; } ~foo(){}; foo和运算符=(常量foo和rhs) { m_val=rhs.m_val; 归还*这个; }; foo&运算符=(常量无符号整数v) { m_val=v; 归还*这个; }; 私人: 无符号整数; 长*m_ptr; };类构造函数和对象实例化/初始化C++/海湾合作委员会 我使用C++类构造函数遇到麻烦,使用GCC .,c++,class,gcc,constructor,C++,Class,Gcc,Constructor,下面的类“foo”应该模拟处理器寄存器,如AL、AH、AX、EAX等,。。。我需要一些与这门课相关的基本算术。 但我在初始化或“foo”对象时有一种奇怪的行为 对于以下两种情况,我没有相同的结果: foo w=0x12345678; // case 1 foo w ; // case 2 init ( 2 steps) w=0x12345678; foo w=0x12345678;//案例1 foo w;//案例2初始(2个步骤) w=0x12345678; 对
你对构造器有些误解。尽管有外观,
foo w=0x12345678代码>不包含对赋值运算符的任何调用。它是复制初始化,并且(主要)相当于:
foo w{foo{0x12345678}};
这不应该编译,因为foo
没有接受int
参数的构造函数
我说“大部分”是因为foow=0x12345678
要求存在从int
到foo
(或foo
的子类)的隐式转换,其中foo w{foo{0x12345678}
涉及显式转换,并且永远不会构造foo
的子类。问题不在发布的代码中(我写这篇文章时)。发布一个完整的、最简单的示例来说明问题。我在另一个编译器(Visual Studio 2010)上尝试了您的代码,但在foo w=0x12345678代码>这是我所期望的。因此,要么你发现了一个编译器错误(不太可能,但并非不可能),要么你没有发布真正的代码。foo有第二个构造函数foo(long*),这个构造函数在foo w=0x0123456中调用@spamy:您使用的编译器版本/选项是什么?对我来说,gcc在该行上生成了一个关于无效转换的致命错误。这正是我所期望的。在这种情况下,你的编译器有一个bug0x0123456
是一个int
,int无法隐式成为指针。好的,但在可能的情况下,foo的对象只是一个或多个属于父对象的对象。这就是为什么有两个构造函数。因此,我必须通过foo w(&parent_object)=0x12345678或foo w=0x12345678;但无论是哪种情况,0x124678都不应该是和地址。@spamy如果您发布一个包含您所描述的问题的完整的小程序,这将有所帮助。此外,由于可能存在编译器错误,因此您正在使用的版本号和编译器选项。