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");
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");
。同样,这只需要一个隐式转换,因此编译器会接受它。
对于新手来说,令人困惑的是,字符串示例中的两种语法都是对同一构造函数的调用!
Pizza p3 = "letters here"; //the same as Pizza p3("letters here"); !!!
Pizza p4("letters here");
相关文章:
- 如何修复此错误:className::className的无效使用
- 枚举类'classname'的多重定义
- 'ClassName'和'ClassInstance'未在此范围内声明
- operator ClassName(){ ... } c++
- 为什么我们不能像在java中使用的那样使用新的ClassName(),而不是使用新的ClassName?
- classname functionname(const classname & objectname)是什么意思?
- ClassName objectName(4) 和 ClassName objectName = 4; 之間的區別是什麼
- 有没有等效的Java <? 扩展 ClassName> 在C++?
- 在 C++ 中是否有等效于 Java 的'classname.this'?
- 基于className的字符串为QObject的子类获取QMetaObject
- 对"ClassName::memberField[abi:cxx11]"的未定义引用
- "new Classname*[]"是什么意思?
- C++ 两个类相互引用 错误:'ClassName'之前预期的类型说明符
- 在工作中遇到这个"operator ClassName *".这是什么意思?
- const classname &obj == classname const &obj?
- typedef void (AFX_MSG_CALL ClassName::*AFX_PMSGptr)(void);
- Arduino:'void (ClassName::)()' 类型的参数在附加中断时与'void (*)()'不匹配
- "class className;"本身在C++中有什么作用?
- 如何解决"未定义对'vtable for <>的引用<ClassName>"错误?
- C++不能从类调用公共方法:对'<ClassName>::<MethodName>'的未定义引用