ClassName objectName(4); 有啥区别?和类名 objectName = 4;

Posted

技术标签:

【中文标题】ClassName objectName(4); 有啥区别?和类名 objectName = 4;【英文标题】:What is the difference between ClassName objectName(4); and ClassName objectName = 4;ClassName objectName(4); 有什么区别?和类名 objectName = 4; 【发布时间】:2019-04-04 00:06:54 【问题描述】: 类比萨() 私人的: 整数值; 上市: 比萨(int x) 值 = x; int main() // 引擎盖下面有什么区别? 比萨 p1 = 2; 比萨 p2(2);

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

Pizza p3 = "这里的字母"; 比萨 p4("这里的信");

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

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

【问题讨论】:

一个是赋值(operator = (...)),另一个是构造函数。您应该使用 C++ 中的构造函数,它可能更有效。尽管进行了所有优化,但它通常在汇编中变成相同的代码。 @AlexisWilke 不正确。两者都是构造函数。 @AlexisWilke 都调用同一个构造函数! 请使用无效的代码发布 MCVE 示例代码中的构造函数采用整数,而不是字符串。请不要简化问题。如果问题需要一个接受字符串的构造函数,那么您的示例代码应该包含一个接受字符串的构造函数。 【参考方案1】:

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

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 语法,有两种方法可以解决此问题。

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

【讨论】:

我认为你应该从每个都是不同类型的en.cppreference.com/w/cpp/language/initialization开始【参考方案2】:

令新手感到困惑的是,您的字符串示例中的两种语法都是对同一个构造函数的调用!

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

【讨论】:

arr... 不完全是。它们是具有不同规则的不同类型的初始化。 C++ 在初始化方面非常复杂。 @bolov 在这种情况下它们是相同的(唯一的区别是构造函数是显式的,或者我们使用的是旧版本的 C++) @M.M 我什至不敢进入初始化规则的世界。我相信你的话:) @bolov 看一下这个例子的前两行:en.cppreference.com/w/cpp/language/converting_constructor这个具体情况 如果它们是相同的,它们实际上会以相同的方式工作,但事实并非如此。

以上是关于ClassName objectName(4); 有啥区别?和类名 objectName = 4;的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的双冒号“::”

.Net 4.0 无法将“System.Collections.Generic.List`1[ClassName]”类型的对象转换为“ClassName”类型

Qt ObjectName()必须是唯一的吗?

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

java.lang.IllegalArgumentException: Registered more than one instance with the same objectName

Classname.Variable 与 Classname 作为变量一起使用