是否接受将构造函数的参数作为类的实例传递?

Is passing the constructor's parameters as an instance of the class accepted?

本文关键字:实例 参数 构造函数 是否      更新时间:2023-10-16

>我遇到了这种情况(简化(
这在编译时没有任何警告,说明它似乎如何将给定参数强制转换为类 A 构造函数中类 B 的实例

class B{
public:
B(int _x) { }
virtual ~B() { }
};
class A{
public:
A(const B& source) { }
virtual ~A() { }
};
int main(){
new A(1);
return 0;
}

1. 这是否被视为良好做法?

我还没有在C++中看到任何代码在要求实例/常量引用时给出构造函数的参数。这是潜规则吗?

2. 在没有警告和有警告的情况下,这在多大程度上是可能的/允许的?

当函数原型请求(不是const(引用时,这不起作用。

3. 编译器什么时候认为这比重载函数更好?

编译以下示例:

class B
{
public:
B(double _x = 0, double _y = 0) { }
virtual ~B() { }
};
class A
{
public:
A(const B& source, int z = 0) {cout << "B class constructor";}
A(double _x, double _y){cout << "primitive types";}
virtual ~A() { }
};
int main()
{
new A(1, 1);
return 0;
}

给出警告(使用某些编译器选项(:

warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
note: candidate 1: A::A(double, double)
note: candidate 2: A::A(const B&, int)

(我知道编译器与int->double(冲突(

但是当从(const B&, int)构造函数中删除int z = 0参数时,警告消失(并且仍然打印"primitive types"(,
在我看来这更加模棱两可。

歧义是如何决定的?

  1. 这被认为是好的做法吗?

我没有在C++中看到任何代码在要求实例/常量引用时提供构造函数的参数。这是潜规则吗?

"给出构造函数的参数"是没有意义的。这里发生的情况是,const B对象是通过您为此目的提供的构造函数从double构造的。没有什么比这更神秘的了。它实际上是一个简单的类型转换操作,如果单步类型转换在传递参数或返回值时可用,C++编译器将始终考虑单步类型转换。

  1. 在没有警告和警告的情况下,这在多大程度上是可能的/允许的?

在某种程度上,可以在一个步骤中没有歧义。

当函数原型请求(非常量(引用时,这不起作用。

这是因为编译器不会根据C++规则构造非常量临时对象。

    编译器
  1. 什么时候认为这比重载函数更好? ...在我的选择中,这要模棱两可得多

其实不然。

如何解决歧义?

没有模棱两可的问题需要解决。C++中没有规则说它应该尝试从两个或多个参数中构造单个const B对象。