C++ 常量字符串和;c+;的构造函数中的名称和字符串名称+;
mName是一个私有成员变量 所以我上了一门课叫Person。我想知道conststring&name和stringname之间有什么区别。我试着只输入字符串和名称,但它给了我一条错误消息 我知道&一个参考资料是不是很像一个地址?我猜常量是必需的,因为引用是常量?还有,为什么字符串和名称不起作用 这是我收到的错误消息 候选构造函数(隐式副本构造函数) 不可行:没有已知的从“const char[4]”到“const Person”的转换 第一个论点 候选构造函数不可行:没有已知的转换 第一个参数从'const char[4]'到'string&'(也称为'basic_string,allocator>&')C++ 常量字符串和;c+;的构造函数中的名称和字符串名称+;,c++,string,C++,String,mName是一个私有成员变量 所以我上了一门课叫Person。我想知道conststring&name和stringname之间有什么区别。我试着只输入字符串和名称,但它给了我一条错误消息 我知道&一个参考资料是不是很像一个地址?我猜常量是必需的,因为引用是常量?还有,为什么字符串和名称不起作用 这是我收到的错误消息 候选构造函数(隐式副本构造函数) 不可行:没有已知的从“const char[4]”到“const Person”的转换 第一个论点 候选构造函数不可行:没有已知的转换 第一个参数
Person(string&name)&name是一个引用,这意味着它只是作为参数传入的字符串的另一个名称。这允许您传入对象本身,而不仅仅是其值。如果你想通过const,你必须使用const。常量无法修改。&name是对name的引用,因此实际对象作为参数传递,而不是副本。当您放置const string&name时,name仍然作为引用传递,但const使其成为引用,因此您无法更改实际对象,只需使用它。const string&name和
string name
之间的区别在于,const string&name
是对字符串的常量引用,在这里,当您将参数传递给函数时,不会创建另一个副本,也不能在函数内部更改它,因为它是常量。选项#1-使用Person(字符串名称)
按值传递参数:
string
构造函数,并在堆栈上创建一个临时string
实例Person
调用构造函数string
使用临时实例调用析构函数Person(const string&name)
:
字符串
实例(其4字节或8字节地址)的引用放在堆栈上Person
调用构造函数Person x(“abc”)
:
编译器首先搜索Person
构造函数,该构造函数接受您传递的参数的显式类型。在本例中,它是您尚未定义的个人(const char[])
然后,编译器搜索任何其他采用“可转换”类型的Person
构造函数。由于存在运算符常量字符串&(常量字符[])
,编译器可以将参数“abc”
从常量字符[]
转换为常量字符串&
。因此,如果您定义了Person(conststring&name)
,那么您的代码就编译成功了
最后,编译器为您定义的每个
人构造函数解释了为什么它不适合您的调用。在本例中,它告诉您没有运算符字符串&(const char[])
,这允许它在调用Person(字符串&)之前将参数“abc”
从const char[]
转换为字符串&
constructor.在尝试使用非常量引用时发布错误消息。错误消息与mName的数据类型有关。您使用了什么数据类型,可以发布完整的代码吗?
Person(const string &name)
{
mName=name;
}
Person(string name)
{
mName=name;
}