【问题标题】:different between const string &name and string name in constructor for c++c++ 构造函数中的 const string &name 和 string name 之间的区别
【发布时间】:2014-03-04 10:52:45
【问题描述】:
Person(const string &name)
{
    mName=name;
}


Person(string name)
{
    mName=name;
}

mName 是一个私有成员变量

所以我创建了一个名为 Person 的类。我想知道 const string &name 和 string name 有什么区别。我试过只输入字符串 &name,但它给了我一条错误消息。

我知道 & 是一个引用,几乎就像一个地址?我猜需要 const 因为引用是常量?另外,为什么字符串 &name 不起作用?

这是我收到的错误消息

候选构造函数(隐式复制构造函数) 不可行:没有从 'const char [4]' 到 'const Person' 的已知转换 第一个论点

候选构造函数不可行:没有已知的转换 第一个参数从 'const char [4]' 到 'string &' (aka 'basic_string, allocator > &') 人(字符串&名称)

【问题讨论】:

  • 发布它在尝试使用非常量引用时给您的错误消息。
  • 错误信息与mName的数据类型有关。你用的什么数据类型,能贴出完整的代码吗?

标签: c++ string


【解决方案1】:

选项 #1 - 按值传递参数,使用 Person(string name)

  1. 调用string构造函数,并在堆栈上创建一个临时的string实例。

  2. Person 构造函数被调用。

  3. string 析构函数与临时实例一起调用。

选项 #2 - 通过引用传递参数,使用 Person(const string& name)

  1. string 实例的引用(其 4 字节或 8 字节地址)放置在堆栈中。

  2. Person 构造函数被调用。

如您所见,选项 #2 通常更有效。

编译错误可能是Person x("abc"):

之类的结果

编译器首先搜索Person 构造函数,该构造函数采用您传递的参数的显式类型。在这种情况下,它是Person(const char[]),您尚未定义。

然后,编译器搜索任何其他采用“可转换”类型的Person 构造函数。由于operator const string&(const char[]) 存在,编译器可以将参数"abc"const char[] 转换为const string&。所以如果你定义了Person(const string& name),那么你的代码就编译成功了。

最后,编译器会为您定义的每个 Person 构造函数解释为什么它不适合您的调用。在这种情况下,它会告诉您没有operator string&(const char[]),这允许它在调用Person(string&) 构造函数之前将参数"abc"const char[] 转换为string&

【讨论】:

    【解决方案2】:

    const string &namestring name 之间的区别在于,const string &name 是对字符串的常量引用,这里将它传递给函数时不会创建另一个副本,并且它也不能在函数内部更改,因为它是恒定的。

    【讨论】:

      【解决方案3】:

      &name 是对 name 的引用,因此实际对象作为参数而不是副本传递。当你放 const string &name 时,name 仍然作为引用传递,但是 const 使你不能改变实际的对象,只需使用它。

      【讨论】:

        【解决方案4】:

        &name 是一个引用,这意味着它只是作为参数传入的字符串的另一个名称。这允许您传入对象本身,而不仅仅是它的值。如果要传入 const,则必须使用 const。不能修改 const。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-07
          • 2013-03-14
          • 1970-01-01
          • 2023-02-02
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多