在函数中返回构造函数参数,在返回时调用构造函数
Returning constructor arguments in function, calls the constructor on return
我遇到了一些让我感到惊讶的代码。这在Visual Studio 2012中编译并且运行良好。
描述类
class Description {
public:
Description(bool valid = false);
~Description(void);
};
主要
Description functionThatReturnsADescription()
{
return 1;
}
int main()
{
Description theDescription = functionThatReturnsADescription();
}
我对functionThatReturnsADescription()
方法感到困惑;返回除描述以外的任何对象如何合法?如果我将其设置为 return 1
,它会使用 valid = true
调用描述构造函数。如果我将其设置为 return false
或 return 0
,它会使用 valid = false
调用 Description 构造函数。
这是否意味着C++编译器总是使用 return 语句的参数调用函数的返回类型构造函数?我以前怎么不知道?!我会发誓这不是合法的C++。
返回描述以外的任何对象如何合法?
您可以返回可隐式转换为 Description
的任何类型。在这种情况下,任何数值类型都可以通过标准转换转换为bool
,然后通过非显式构造函数转换为Description
。
如果您愿意,可以通过声明构造函数 explicit
来阻止此转换。养成这种习惯是个好主意,以避免像这样的意外转换。
这是否意味着C++编译器总是使用 return 语句的参数调用函数的返回类型构造函数?
如果类型不匹配,并且有合适的非显式构造函数用于转换,则可以
。我以前怎么不知道?!
C++是一种复杂的语言。十五年后,我仍然不断发现我不知道的东西。
1
被隐式转换为true
,因此选择接受bool
的构造函数。
为了防止这种隐式转换,您可以将构造函数标记为 explicit
,在这种情况下,只有
return Description(1);
会工作。
返回值1
被隐式转换为布尔true
然后作为参数传递给构造函数。Description
对象是使用构造函数Description(bool valid = false);
隐式创建的。
需要注意的是,这里发生了两个隐式转换:1 →真实的→描述。您可以通过使构造函数explicit
来阻止第二次转换。将构造函数的声明更改为
explicit Description(bool valid = false);
但是,第一次转换仍然会发生,即仍然可以执行return Description(1);
。
参考:C++中的显式关键字是什么意思?
- 获取从C++中同一类中的构造函数调用的方法返回的值
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 为什么使用 std::istream_iterator 构造函数返回指针
- 函数返回时,带指针的复制构造函数失败
- 复制构造函数 C++ 在析构函数上返回奇怪的字母
- 在 C++ 中返回新的构造函数(*this)工厂
- 为什么原始卷曲构造函数 {} 不返回右值?
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 使用构造函数从函数返回对象
- 从类似构造函数的调用返回模板化智能指针
- 如何从构造函数返回错误代码?
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 返回带有另一个类的数据成员的构造函数?遇到转换错误?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 在函数中返回构造函数参数,在返回时调用构造函数
- 返回构造函数的类型定义-如何修复此标头
- 我可以通过返回构造函数直接返回对象吗?