C++ 常量字符串和;c+;的构造函数中的名称和字符串名称+;

C++ 常量字符串和;c+;的构造函数中的名称和字符串名称+;,c++,string,C++,String,mName是一个私有成员变量 所以我上了一门课叫Person。我想知道conststring&name和stringname之间有什么区别。我试着只输入字符串和名称,但它给了我一条错误消息 我知道&一个参考资料是不是很像一个地址?我猜常量是必需的,因为引用是常量?还有,为什么字符串和名称不起作用 这是我收到的错误消息 候选构造函数(隐式副本构造函数) 不可行:没有已知的从“const char[4]”到“const Person”的转换 第一个论点 候选构造函数不可行:没有已知的转换 第一个参数

mName是一个私有成员变量

所以我上了一门课叫Person。我想知道conststring&name和stringname之间有什么区别。我试着只输入字符串和名称,但它给了我一条错误消息

我知道&一个参考资料是不是很像一个地址?我猜常量是必需的,因为引用是常量?还有,为什么字符串和名称不起作用

这是我收到的错误消息

候选构造函数(隐式副本构造函数) 不可行:没有已知的从“const char[4]”到“const Person”的转换 第一个论点

候选构造函数不可行:没有已知的转换 第一个参数从'const char[4]'到'string&'(也称为'basic_string,allocator>&')
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
    使用临时实例调用析构函数

  • 选项#2-通过引用传递参数,使用
    Person(const string&name)

  • 字符串
    实例(其4字节或8字节地址)的引用放在堆栈上

  • Person
    调用构造函数

  • 如您所见,选项2通常效率更高

    编译错误可能是类似于
    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;
    }