ClassName objectName(4) 和 ClassName objectName = 4; 之間的區別是什麼

What is the difference between ClassName objectName(4); and ClassName objectName = 4;

本文关键字:ClassName objectName      更新时间:2023-10-16
class Pizza() { 私人: 整数值; 公共: 披萨(int x) { 值 = x; } } int main() { 引擎盖下有什么区别? 披萨 p1 = 2; 披萨p2(2); }

我问这个问题的原因是,如果我有一个接受字符串的 Pizza 构造函数,

披萨 p3 ="这里的字母"; 披萨p4("这里的字母");

带有 p3 的行会产生类型转换错误。这是因为它要采用的实际类型是常量字符*。

带有 p4 的行工作正常。为什么当"这里的字母"在( )中时,它被做成一个字符串对象,但是当"这里的字母"只是在=符号之后时,它的类型是const char*。

我假设你有一个看起来像这样的构造函数。

Pizza(std::string x) {
...
}

你这样称呼它。

Pizza p3 = "letters here";
Pizza p4("letters here");
Pizza p5 = Pizza("letters here");

p4p5都很好。我们用const char*参数调用Pizza构造函数。我们需要一个std::string,并且有一个方便的从const char*std::string的隐式转换,所以这一切都有效。p3是不同的;我们正在尝试const char*转换为Pizza。我们有一个从const char*std::string的转换和一个从std::stringPizza的转换,但C++编译器只会为每个参数进行一次隐式转换,因此它不会花费我们需要的那两个跃点到达那里。

有两种方法可以解决此问题,如果您仍然喜欢p3语法。

  1. 我们可以编写一个接受const char*的构造函数,这只需要一次隐式转换,所以一切都会签出。如果我们想要相同的行为,构造函数甚至可以委托给std::string版本。
  2. 我们可以显式地投射到std::string,如Pizza p3 = std::string("letters here");。同样,这只需要一个隐式转换,因此编译器会接受它。

对于新手来说,令人困惑的是,字符串示例中的两种语法都是对同一构造函数的调用!

Pizza p3 = "letters here"; //the same as Pizza p3("letters here");  !!!
Pizza p4("letters here");