c ++临时对象是否已创建?

时间:2016-10-18 18:17:30

标签: c++ object constructor function-call

我想知道这段代码是如何工作的。

class Room
{
    int sqft;
public:
    Room(int k)
    {
        sqft = k;
    }
    int add(Room r)
    {
        return r.sqft + sqft;
    }
};
int main()
{
    Room living = Room(400);
    Room Kitchen = Room(250);
    Room Bedroom = Room(300);
    int total = living.add(Kitchen.add(Bedroom)); // ***
    cout << total << endl;

    system("pause");
    return 0;
}

已加星标的行正在调用Room类中的add函数。但在Kitchen.add(Bedroom)之后,返回的类型是一个int。没有一个add函数可以将int作为参数,所以我希望代码出错。我认为该行必须是:

int total = living.add(Room(Kitchen.add(Bedroom)));

这确实也有效,我只是不明白它是如何工作的只是传递int来添加,因为这条线也适用:

cout << living.add(10);

似乎因为Room接受了int构造函数c ++,然后知道如何隐式地将int转换为Room。这是真的? C ++在幕后发生了什么事情才能使这个工作?

3 个答案:

答案 0 :(得分:2)

是的,因为您声明了一个带有int参数的构造函数,编译器会隐式地将int转换为Room

通过声明构造函数是显式的来修复此问题,然后编译器将不再进行隐式转换,但需要显式地调用构造函数,就像在示例中一样。

  explicit Room(int k)
//^^^^^^^^
{
    sqft = k;
}

Room Bedroom = Room(300);                       // still works
int total = living.add(Kitchen.add(Bedroom));   // gives compile error
total = living.add(Room(Kitchen.add(Bedroom))); // works

答案 1 :(得分:1)

该行

 int total = living.add(Kitchen.add(Bedroom)); 

可以分解为执行第一次

 Kitchen.add(Bedroom)

我们返回int。然后编译器查找Room。然后它抓住了头脑思考 - 我知道我可以通过使用构造函数从Room创建int。然后它会消失并为你做这件事。

答案 2 :(得分:0)

定义构造函数室(int x)。这意味着当你调用一个具有Room参数的方法,但是用int调用它时,而不是 编译器通过调用构造函数Room(your_int_argument)自动转换int,从而为函数调用创建合适的房间对象。它被称为隐式转换。