![](/img/trans.png)
[英]c++ difference between std::string name and std::string &name
[英]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:
调用string
构造函数,并在堆栈上创建临时string
实例。
调用Person
构造函数。
使用临时实例调用string
析构函数。
选项#2 - 使用Person(const string& name)
传递参数by-reference:
对string
实例(其4字节或8字节地址)的引用放在堆栈上。
调用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 &name
与string name
之间的区别在于, const string &name
是对字符串的常量引用,此处在将其传递给函数时不会创建另一个副本,也不能在函数内部更改它,因为它是常量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.