Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类构造函数和对象实例化/初始化C++/海湾合作委员会 我使用C++类构造函数遇到麻烦,使用GCC ._C++_Class_Gcc_Constructor - Fatal编程技术网

类构造函数和对象实例化/初始化C++/海湾合作委员会 我使用C++类构造函数遇到麻烦,使用GCC .

类构造函数和对象实例化/初始化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”应该模拟处理器寄存器,如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; };
你对构造器有些误解。尽管有外观,
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在该行上生成了一个关于无效转换的致命错误。这正是我所期望的。在这种情况下,你的编译器有一个bug
0x0123456
是一个
int
,int无法隐式成为指针。好的,但在可能的情况下,foo的对象只是一个或多个属于父对象的对象。这就是为什么有两个构造函数。因此,我必须通过foo w(&parent_object)=0x12345678或foo w=0x12345678;但无论是哪种情况,0x124678都不应该是和地址。@spamy如果您发布一个包含您所描述的问题的完整的小程序,这将有所帮助。此外,由于可能存在编译器错误,因此您正在使用的版本号和编译器选项。