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");
p4
和 p5
没问题。我们使用const char*
参数调用Pizza
构造函数。我们需要一个std::string
,并且有一个方便的从const char*
到std::string
的隐式转换,所以一切正常。 p3
不同;我们正在尝试将const char*
转换为Pizza
。我们有一个从const char*
到std::string
的转换,还有一个从std::string
到Pizza
的转换,但是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;的主要内容,如果未能解决你的问题,请参考以下文章
.Net 4.0 无法将“System.Collections.Generic.List`1[ClassName]”类型的对象转换为“ClassName”类型
QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)
java.lang.IllegalArgumentException: Registered more than one instance with the same objectName