gpt4 book ai didi

c++ - 类构造函数和对象实例化/初始化 C++/GCC

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:09 24 4
gpt4 key购买 nike

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

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

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

foo w=0x12345678; //  case 1foo 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; 需要存在从 intfoo(或子类)的隐式转换foo), 其中foo w{foo{0x12345678}};涉及显式转换,永远不会构造foo的子类。

关于c++ - 类构造函数和对象实例化/初始化 C++/GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com