我有一个这样的类。我想使用字符串的引用,但它不起作用。我怎么能使用字符串& ?
#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;'
答案 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) { }