使用字符串引用

时间:2013-03-12 11:57:16

标签: c++ reference

我有一个这样的类。我想使用字符串的引用,但它不起作用。我怎么能使用字符串& ?

#include <string>
using namespace std;
class T
{
public:
    T(string& s);
private:
    string s;
};

T::T(string& s)
{
    this->s = s;
}
int main(void)
{
    T t("Test Object");
    return 0;
}
  

错误:'T :: T(std :: string&amp;)':无法将参数1从'const char [12]'转换为'std :: string&amp;'

5 个答案:

答案 0 :(得分:5)

使用const

class T
{
public:
    T(const string& ss);
private:
    string s;
};

T::T(const string& ss) : s(ss)
{
}
在传递给"Test Object"的构造函数之前,

const将被构造为string T,因此构造函数必须接受const string

答案 1 :(得分:2)

你没有传入std :: string。正如它所说,它无法从const char数组转换为string-ref。更改构造函数以获取const-ref并且它将起作用。这是因为必须从char数组创建一个临时字符串,并且你只能对临时数组进行const引用以阻止你混淆(如果修改临时字符串,那么更改将被丢弃,所以语言阻止你这样做。)

答案 2 :(得分:1)

C ++ 98/03 中,如果您有一个不便宜的课程要复制(例如int或{{1}复制是便宜的,double不是,因为它的副本可能涉及分配新的堆内存,将字符从源复制到目的地等等),然后规则是通过 {{1参考 std::string

const

然后在构造函数中执行:

const std::string&

但是,在 C ++ 11 中,移动语义可用,新规则似乎是:如果您需要副本 (并且对象移动成本很低,通常应该如此),通过值传递并从值移动

class T
{
public:
    T(const string& s); // <--- const string&
private:
    string m_s;
};

(最好的方法是提供几个重载,传递T::T(const string& s) : m_s(s) {} 并传递值,但可能这不一定在所有应用程序中,但仅在您需要挤压性能时。)

请注意,当您不需要副本,只需要观察参数时,通常的T::T(string s) // pass by value : m_s( std::move(s) ) // and move from the value {} 规则的C ++ 98/03传递仍然有效。< / p>

答案 3 :(得分:0)

引用需要使用构造函数的initialiser-list进行初始化。将构造函数更改为:

T::T(string& s) : s(s)
{
}

另外,将您的会员s定义为std::string& s,以便能够参考。

可能更改s的名称以避免含糊不清。

请参阅SO上的this条目。

答案 4 :(得分:0)

您定义的构造函数通过引用获取std::string

T::T(std::string& s)
{
    this->s = s;
}

因此,最直接的做法是创建一个std::string对象,该对象将传递给此构造函数:

std::string s("Test Object");
T t(s);

但是由于你的构造函数没有改变你传递给它的std::string(它只用于设置T数据成员的值),你应该通过const引用:T::T(const string& s)。此外,不是让数据成员s被构造并在以后为其分配另一个字符串,而是直接在初始化列表中构造此成员,这样会更好:

T::T(const std::string& str) : s(str) { }