繁体   English   中英

在c ++的构造函数中,const字符串和名称以及字符串名称之间有所不同

[英]different between const string &name and string name in constructor for c++

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


Person(string name)
{
    mName=name;
}

mName是一个私有成员变量

所以我创建了一个名为Person的类。 我想知道const字符串和名称与字符串名称之间的区别。 我试过把字符串和名称,但它给了我一个错误信息。

我知道&是一个参考,所以几乎像一个地址? 我猜测需要const,因为引用是常量? 另外,为什么不只是字符串和名称工作?

这是我收到的错误消息

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

候选构造函数不可行:没有已知的'const char [4]'转换为'string&'(又名'basic_string,allocator>&')第一个参数Person(string&name)

选项#1 - 使用Person(string name)传递参数by-value:

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

  2. 调用Person构造函数。

  3. 使用临时实例调用string析构函数。

选项#2 - 使用Person(const string& name)传递参数by-reference:

  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&

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

&name是对name的引用,因此实际对象作为参数传递,而不是副本。 当你输入const字符串和名称时,name仍然作为引用被传递,但是const使得它不能改变实际的对象,只需使用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM