gpt4 book ai didi

c++ - 隐式构造函数参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:29 25 4
gpt4 key购买 nike

我一直认为C++中的隐式构造函数只能是一个只有一个参数的构造函数。例如:

class Foo1
{
Foo(int); // This could be an implicit constructor
};

但是下面的代码对吗:

class Foo2
{
Foo2(int, int=0); // Would compiler use this as an implicit constructor?
}

我能做到:

Foo1 obj;
...
obj = 5;

Foo2 呢?

最佳答案

首先,任何构造函数都可以标记为explicit。它有多少参数是无关紧要的。

除此之外,您现在需要了解 explicit 的真正含义。这只是意味着调用构造函数的唯一方法是当您显式指定类名时:

struct foo
{
foo(int){}
explicit foo(double){}
};

void bar(foo){}

bar(5); // okay, calls foo(int) to construct the foo
bar(3.14); // error, cannot call foo(double) because foo was not explicitly used
bar(foo(3.14)); // okay, calls foo(double) to construct the foo

我们不显式标记多参数构造函数的原因是因为它没用。鉴于:

struct baz
{
baz(int, int, int);
};

除了说 baz 之外,您还能如何调用该构造函数? (如 baz(1, 2, 3)。)†

在您的示例中,explicit 是明智的,因为您可以仅使用一个参数调用该构造函数。你实际做什么只取决于你是否认为它应该是隐式可转换的。


†这忽略了 C++11 初始化列表。在 C++11 中,我想你可以说:

void qaz(baz) {}

qaz({1, 2, 3});

并设法获得到多参数构造函数的隐式转换,但我对初始化列表的了解还不够多,除了作为脚注外,无法做出有意义的评论。

关于c++ - 隐式构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com