【问题标题】:Constructor invocation in C++C++ 中的构造函数调用
【发布时间】:2021-12-22 10:19:47
【问题描述】:

我试图找出这个程序在 C++ 中的输出。

#include<iostream>
using namespace std;

class MyInt {
    int i;
    public:
        MyInt() {
            cout<<1;
            i = 0;
        }
        MyInt(int i) {
            cout<<2;
            this->i = i;
        }
        int value(){
            return i;
        }
};

int main() {
    MyInt i;
    i = 10;
    cout<<i.value();
} 

我预计输出是210,但程序的输出是1210。 那么为什么在这种情况下会同时调用默认构造函数和参数化构造函数呢?

【问题讨论】:

  • MyInt i; 调用默认构造函数。
  • MyInt i; -- 不确定你期望这样做,因为你正在构造一个MyInt 对象,而构造一个对象意味着将调用一个构造函数。也许如果您将变量命名为 i 以外的其他名称,图片会更清晰一点?
  • 一句话提示;空格。

标签: c++ class constructor


【解决方案1】:
MyInt i;

以上行调用MyInt::MyInt(),创建一个对象并输出1

i = 10;

以上行调用MyInt::MyInt(int i),创建另一个对象并输出2。然后将第二个对象分配给第一个对象,它什么也不输出。

cout<<i.value();

以上行调用MyInt::value(),输出10

【讨论】:

  • 哪一行实际创建了对象?对象只创建一次,为什么构造函数调用了两次,一次没有参数,一次有参数10?
  • @brahmdevpandey 您实际上是在创建多个MyInt 对象:您试图将10 分配给i,但10int,它需要转换为MyInt 在分配成功之前。而这种(隐式)转换是通过 MyInt(int) 构造函数发生的。
  • @brahmdevpandey MyInt 没有实现 operator=(int) 赋值运算符,但编译器会自动生成默认的 operator=(const MyInt &amp;) 复制赋值运算符。因此,当您将int 分配给现有的MyInt 对象时,编译器会看到operator= 接受MyInt 对象,并且可以(隐式)从int 构造MyInt 对象通过MyInt(int) 构造函数(未标记为explicit),因此可以创建一个临时的MyInt 来满足分配。 IOW,它将i = 10; 视为i = MyInt(10); 这就是第二个MyInt 对象的来源
  • @KonradRudolph @RemyLebeau 哦。知道了。那么是不是意味着如果我尝试给MyInt对象i赋值一个String,编译器应该会报错?
  • 是的。编译器确实给出了ambiguous overload of operator= 的错误。感谢您的澄清。
【解决方案2】:

如果你想打印 210 你应该写:

MyInt i = 10;
std::cout << i.value();

MyInt 我;调用默认构造函数。这就是为什么要先打印 1。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 2015-03-17
    • 2021-07-19
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多