我有以下构造函数:
TCPConnector(int32_t fd, string ip, uint16_t port,
vector<uint32_t>& protocolChain, const Variant& customParameters)
: IOHandler(fd, IOHT_TCP_CONNECTOR) {
_ip = ip;
_port = port;
_protocolChain = protocolChain;
_closeSocket = true;
_customParameters = customParameters;
}
我想知道是否可以在构造函数中安全地分配字符串(即_ip)而不显式初始化它?
答案 0 :(得分:7)
std::string
有several constructors。在您的情况下,它是默认构造的(到“”),然后被赋予一个新值。
考虑将它(和您的其他变量)放入初始化列表中:
: _ip(ip) ...
答案 1 :(得分:3)
std :; string有一个默认构造函数,用于构造_ip(假设它是一个字符串)。然后,您可以安全地分配给它。但是,使用初始化列表是更好的做法:
TCPConnector(int32_t fd, string ip, uint16_t port,
vector<uint32_t>& protocolChain, const Variant& customParameters)
: IOHandler(fd, IOHT_TCP_CONNECTOR),
_ip( ip ),
_port( port ),
_protocolChain( protocolChain ),
_closeSocket( true ),
_customParameters( customParameters )
{
}
这使用复制构造来创建像_ip这样的对象,而不是默认构造然后赋值。这样更有效,并且是不支持默认构造但提供其他构造函数的类所必需的,例如复制构造函数。
答案 2 :(得分:1)
嗯,这是安全的,效率低下。编译器将生成对默认构造函数的调用。这样写它是为了避免这种情况:
TCPConnector(/* etc... */)
: IOHandler(fd, IOHT_TCP_CONNECTOR), _id(id)
{
// the rest of them
}
答案 3 :(得分:0)
当然,为什么不呢?
是的,偶尔,你会遇到一个有特殊分配要求的课程。这些并不是标准中的基本类型。
答案 4 :(得分:0)
是。在上面的代码中,_ip
将默认构造,然后使用赋值运算符为其分配一个新字符串ip
。如果在初始化列表中初始化_ip
,则保存字符串的默认构造,这将保存函数调用并可能保存堆分配。初始化列表中的初始值设定项按照在类声明中声明成员的顺序进行处理。