【问题标题】:C++ Class initialization with pointer as constructor param使用指针作为构造函数参数的 C++ 类初始化
【发布时间】:2016-03-19 08:34:02
【问题描述】:

下面是我写的一个C++类,

class MyString:public string{
  public:
  MyString(string s):string(s){}
};

int main()
{
  MyString s1("abc");
  MyString s2 = "cdf";
  return 0;
}

在上面的代码中,My String s2 = "cdf" 行无法编译,但是如果我将 MyString 类的构造函数参数更改为public:MyString(const char s[]):string(s){},那么这行将编译。这是为什么? C++中string和char[]不是一回事吗?

谢谢,

【问题讨论】:

  • “C++中string和char[]不一样吗?”不。
  • 我还会查找并阅读有关 const 和参考资料 - 使代码更快
  • 也许您应该阅读该错误,有时它们会提供很多信息,并且实际上会告诉您代码有什么问题...
  • @juanchopanza 并且不再有关于 cmets 中显示的评论;)
  • 不,它是隐式创建的,@AndrewTruckle。

标签: c++ string char


【解决方案1】:
MyString s2 = "cdf"

这样做将 s2 等同于具有值“cdf”的字符串文字。但这是错误的,因为MyString 是您自己的数据类型,而您将其等同于char * 类型的变量。

如果你想在初始化时使用等号,你需要这样做:

MyString s2 = MyString(std::string("cdf")); 

这会以字符串“cdf”为参数调用您的构造函数,并将对象复制到 s2。

String 和 char 完全不同! String 是派生的数据类型,是 C++ 标准库的一部分,而 char 只是一个字符数组。在此处阅读有关string 的信息: http://www.cplusplus.com/reference/string/string/

【讨论】:

  • 字符串文字不是const char *类型。
  • @ChristianHackl 好的。你可以编辑答案,所以它可以更清楚。因为我知道它是 char* 类型。
  • 首先要更清楚地区分const和非const。至于字符串字面量,它们是数组。 "cdf" 的类型为 char const[4]。
  • @ChristianHackl 但如果我们这样做char *s = "cdf";,我会声明一个字符串文字,它是一个常量。我在哪里困惑?
  • char *s = "cdf"; 是一个不推荐使用的转换,您不应该使用它。在char const* s = "cdf" 的情况下,发生了从数组到指向数组第一个元素的指针的简单转换。这并没有改变转换源是数组的事实。
猜你喜欢
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多