ClassName objectName(4)和有什么区别?并且ClassName objectName = 4;

时间:2019-04-04 00:06:55

标签: c++


    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 *。

2 个答案:

答案 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::stringconst char*有一个方便的隐式转换,因此一切正常。 std::string是不同的;我们正在尝试将p3转换为const char*。我们有一个从Pizzaconst char*的转换,还有一个从std::stringstd::string的转换,但是C ++编译器每个参数只会做一次隐式转换,因此它不需要我们需要到达那两跳。

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

  1. 我们可以编写一个接受一个p3的构造函数,该构造函数仅需要一次隐式转换,以便一切都可以检出。如果我们想要相同的行为,构造函数甚至可以委托给const char*版本。
  2. 我们可以显式转换为std::stringstd::string。同样,这仅需要一次隐式转换,因此编译器会接受它。

答案 1 :(得分:-1)

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

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