C++ 构造函数中的常量字符串 &name 和字符串名称之间的差异


Person(const string &name)
{
    mName=name;
}

Person(string name)
{
    mName=name;
}

Mname是私人成员变量

所以我做了一个叫人的课。我想知道const String&名称和字符串名称的区别是什么。我尝试过仅包含字符串&名称,但它给了我一个错误消息。

我知道&引用几乎像一个地址一样吗?我猜是需要const,因为参考是常数吗?另外,为什么不只是字符串& name工作?

这是我收到的错误消息

候选构造函数(隐式复制构造函数) 不可行:从" const char [4]"到" const人"的已知转换尚无 对于第一个参数

候选构造函数不可行:没有已知的转换 从" const char [4]'到'string&'(又名'BASIC_STRING,分配器>&')对于第一参数 人(字符串& name)

选项#1-通过Person(string name)

传递参数by -value
  1. string构造函数被称为构造器,并在堆栈上创建一个临时string实例。

  2. Person构造函数称为。

  3. string destructor用临时实例调用。

选项#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[]转换为CC_21。

& name是一个参考,这只是您作为参数传递的字符串的另一个名称。这使您可以传递对象本身,而不仅仅是其价值。如果您想通过const,则必须使用const。const无法修改。

&名称是对名称的引用,因此实际对象作为参数传递,而不是副本。当您将const字符串&名称放置时,名称仍在作为参考中传递,但是const可以使其构成,因此您不能更改实际对象,只需使用它。

const string &namestring name之间的差异是, const string &name是对字符串的常数引用,当您将其传递给函数时,也不会创建另一个副本,也无法在函数内更改它因为它是恒定的。

最新更新