C++ 构造函数中的常量字符串 &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是私人成员变量
所以我做了一个叫人的课。我想知道const String&名称和字符串名称的区别是什么。我尝试过仅包含字符串&名称,但它给了我一个错误消息。
我知道&引用几乎像一个地址一样吗?我猜是需要const,因为参考是常数吗?另外,为什么不只是字符串& name工作?
这是我收到的错误消息
候选构造函数(隐式复制构造函数) 不可行:从" const char [4]"到" const人"的已知转换尚无 对于第一个参数
候选构造函数不可行:没有已知的转换 从" const char [4]'到'string&'(又名'BASIC_STRING,分配器>&')对于第一参数 人(字符串& name)
选项#1-通过Person(string name)
:
string
构造函数被称为构造器,并在堆栈上创建一个临时string
实例。Person
构造函数称为。string
destructor用临时实例调用。
选项#2-通过Person(const string& name)
传递参数征用:
对
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[]
转换为CC_21。
& name是一个参考,这只是您作为参数传递的字符串的另一个名称。这使您可以传递对象本身,而不仅仅是其价值。如果您想通过const,则必须使用const。const无法修改。
&名称是对名称的引用,因此实际对象作为参数传递,而不是副本。当您将const字符串&名称放置时,名称仍在作为参考中传递,但是const可以使其构成,因此您不能更改实际对象,只需使用它。
const string &name
和 string name
之间的差异是, const string &name
是对字符串的常数引用,当您将其传递给函数时,也不会创建另一个副本,也无法在函数内更改它因为它是恒定的。
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 两个字符串之间的数学运算
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- 正则表达式匹配字符串之间的数字
- 如何更有效地计算n个字符串之间的不匹配分数?
- 最接近的字符串:在字符串阵列中找到2个字符串之间的最小距离
- 在字符串之间插入字符
- STD :: cin和Scanf()应用于字符串之间的区别
- 使用 c++ 获取两个日期与时间字符串之间的差异(以秒为单位)
- 如何在C 中的字符串之间留出空间
- 在文本中的两个非唯一字符串之间获取子弦
- 假定相同的字符串之间的比较失败' == '比较
- C++提取两个字符串之间的数据
- C++ 和 pascal 字符串之间的区别
- 如何在C++中获取子字符串并在字符串之间添加字符
- 在C++代码中,如何让用户在2个文本字符串之间输入一个数字
- 如何在Visual C 中的BSTR和32位Unicode字符串之间进行转换