class Pizza() { private: int value; public: Pizza(int x) { value = x; } } int main() { // What is the difference here under the hood? Pizza p1 = 2; Pizza p2(2); }
我问这的原因是,如果我有一个接受字符串的Pizza构造函数,
Pizza p3 = "letters here"; Pizza p4("letters here");
带有p3的行产生类型转换错误。这是因为它要使用的实际类型是const char *。
使用p4的行工作正常。为什么在()中的“这里的字母”是一个字符串对象,但是当“这里的字母”仅位于=符号之后时,其类型为const char *。
答案 0 :(得分:4)
我将假设您有一个看起来像这样的构造函数。
<style>
.klass { color: red }
</style>
<table id="myTable">
<thead>
<tr> <th>A</th> <th>B</th> <th>C</th> </tr>
</thead>
<tbody>
<tr> <td>a</td> <td>b</td> <td>c</td> </tr>
<tr> <td>a</td> <td>b</td> <td>c</td> </tr>
<tr> <td>a</td> <td>b</td> <td>c</td> </tr>
</tbody>
</table>
<script>
var index = 0;
document.querySelectorAll("#myTable tbody tr")
.forEach((tr)=> tr.querySelectorAll('td')[index++].className += " klass")
</script>
您这样称呼它。
Pizza(std::string x) {
...
}
Pizza p3 = "letters here";
Pizza p4("letters here");
Pizza p5 = Pizza("letters here");
和p4
很好。我们使用p5
参数调用Pizza
构造函数。我们需要一个const char*
,并且从std::string
到const char*
有一个方便的隐式转换,因此一切正常。 std::string
是不同的;我们正在尝试将p3
转换为const char*
。我们有一个从Pizza
到const char*
的转换,还有一个从std::string
到std::string
的转换,但是C ++编译器每个参数只会做一次隐式转换,因此它不需要我们需要到达那两跳。
如果您仍然喜欢Pizza
语法,有两种方法可以解决此问题。
p3
的构造函数,该构造函数仅需要一次隐式转换,以便一切都可以检出。如果我们想要相同的行为,构造函数甚至可以委托给const char*
版本。std::string
到std::string
。同样,这仅需要一次隐式转换,因此编译器会接受它。答案 1 :(得分:-1)
对于新手来说,令人困惑的是,字符串示例中的两种语法都是对同一构造函数的调用!
Pizza p3 = "letters here"; //the same as Pizza p3("letters here"); !!!
Pizza p4("letters here");