gpt4 book ai didi

c++ - ClassName objectName(4); 有什么区别?和 ClassName objectName = 4;

转载 作者:行者123 更新时间:2023-11-28 01:22:27 25 4
gpt4 key购买 nike

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

最佳答案

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

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 不同;我们正在尝试将 convert const char*Pizza。我们有一个从 const char*std::string 的转换,还有一个从 std::stringPizza 的转换,但 C++ 编译器只会对每个参数进行一次隐式转换,因此它不需要我们到达那里所需的那两个跃点。

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

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

关于c++ - ClassName objectName(4); 有什么区别?和 ClassName objectName = 4;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55506001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com