2014-02-07 30 views
1
Person(const string &name) 
{ 
    mName=name; 
} 


Person(string name) 
{ 
    mName=name; 
} 

MNAME是一个私有成员变量常量字符串和名称和字符串名称构造对于C之间不同++

所以我做了一个名为Person类。我想知道什么是const字符串&名称和字符串名称之间的区别。我试图把字符串&名称,但它给了我一个错误消息。

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

这是我

候选构造函数(隐含的拷贝构造函数) 不可行的错误消息:从“为const char [4]”到“const的人” 没有已知转换为第一个参数

候选构造并不可行:没有已知的从转换 '为const char [4]' 到 '串&'(又名 'basic_string的,分配器> &'),用于第一参数 人(串&名)

+0

发布它在尝试使用非const引用时给出的错误消息。 – Yuushi

+0

错误消息与mName的数据类型有关。你使用了哪些数据类型,你可以发布完整的代码吗? – vathsa

回答

0

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

0

&名称是对名称的引用,所以实际的对象作为参数传递,而不是副本。当你把常量字符串&名称,名称仍然作为参考传递,但常量使得它不能改变实际的对象,只是使用它。

0

const string &namestring name之间的不同之处在于,const string &name是恒定的参考,在这里,当你将它传递给函数不创建另一个副本,一个字符串也不能在函数内部改变,因为它是恒定的。

3

选项#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[])存在,编译器可以将参数​​从const char[]转换为const string&。因此,如果您定义了Person(const string& name),那么您的代码已成功编译。

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