c ++临时对象创建了吗?
c++ temp object created?
我想知道这段代码是如何工作的。
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;
}
带星标的线路正在调用房间内的添加功能 class。但是在 Kitchen.add(Bedroom) 之后返回的类型是一个 int。没有将 int 作为参数的添加函数,所以我预计代码会出错。我认为该行需要是:
int total = living.add(Room(Kitchen.add(Bedroom)));
这确实也有效,我只是不明白它是如何工作的,只是将 int 传递给 add 因为这一行也有效:
cout << living.add(10);
似乎因为 Room 采用了一个 int 构造函数,所以 c++ 知道如何将一个 int 隐式转换为 Room。这是真的?幕后的 C++ 中发生了什么?
行
int total = living.add(Kitchen.add(Bedroom));
可以分解先执行这个
Kitchen.add(Bedroom)
这里我们return一个int
。然后编译器查找 Room
。然后它挠挠头想——我知道我可以通过使用构造函数从 int
创建 Room
。然后它会消失并为您执行此操作。
是的,这是真的,因为你声明了一个带有 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
Constructor Room(int x) 已定义。这意味着当你调用一个有 Room 参数的方法,但是用一个 int 来调用它时,比
编译器通过调用构造函数 Room(your_int_argument) 自动转换 int,从而为函数调用创建合适的房间对象。这叫做隐式转换。
我想知道这段代码是如何工作的。
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;
}
带星标的线路正在调用房间内的添加功能 class。但是在 Kitchen.add(Bedroom) 之后返回的类型是一个 int。没有将 int 作为参数的添加函数,所以我预计代码会出错。我认为该行需要是:
int total = living.add(Room(Kitchen.add(Bedroom)));
这确实也有效,我只是不明白它是如何工作的,只是将 int 传递给 add 因为这一行也有效:
cout << living.add(10);
似乎因为 Room 采用了一个 int 构造函数,所以 c++ 知道如何将一个 int 隐式转换为 Room。这是真的?幕后的 C++ 中发生了什么?
行
int total = living.add(Kitchen.add(Bedroom));
可以分解先执行这个
Kitchen.add(Bedroom)
这里我们return一个int
。然后编译器查找 Room
。然后它挠挠头想——我知道我可以通过使用构造函数从 int
创建 Room
。然后它会消失并为您执行此操作。
是的,这是真的,因为你声明了一个带有 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
Constructor Room(int x) 已定义。这意味着当你调用一个有 Room 参数的方法,但是用一个 int 来调用它时,比 编译器通过调用构造函数 Room(your_int_argument) 自动转换 int,从而为函数调用创建合适的房间对象。这叫做隐式转换。