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

标签 c++ class gcc constructor

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

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

相关文章:

C# 从不同的表单类调用方法?

Python - 在类声明中访问父类装饰器

C memcpy 错误 - 在 Windows XP 上无法写入内存

gcc - 为什么这个函数序言使用了几条指令来计算 esp 减少?

c++ - 如何从包含符号、数字和字母的文本文件中读取整数?

c++ - 在按键之间添加延迟

c++ - C++ 数组中的问题

C++:char** 到 const char** 的转换

c++ - gcc/g++ 可以在忽略我的寄存器时告诉我吗?

C++ 运算符重载错误