一个 std::string 可以在构造函数中被赋值吗?

4

我有以下构造函数:

 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)而不需要显式初始化?

5个回答

7

std::string几个构造函数。在您的情况下,它是默认构造的(为“”),然后被赋予一个新值。

考虑将其(以及其他变量)放入初始化列表中:

: _ip(ip) ...

2
这里是C++ FAQ Lite关于赋值与初始化的链接,以补充此答案:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6 - indiv

3

std::string有一个默认构造函数,将用于构造_ip(假设它是一个字符串)。然后,您可以安全地将其分配给它。但是,使用初始化列表是更好的实践:

注意:保留HTML标记。

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 这样的对象,而不是默认构造函数再进行赋值。这种方式更高效,并且对于不支持默认构造函数但提供其他构造函数(例如复制构造函数)的类是必需的。


1

嗯,这样做是安全的,只是效率低下。编译器会生成对默认构造函数的调用。为了避免这种情况,请改成这样写:

TCPConnector(/* etc... */)
    : IOHandler(fd, IOHT_TCP_CONNECTOR), _id(id) 
{
  // the rest of them
}

0

当然,为什么不呢?

是的,偶尔你会遇到一个具有特殊分配要求的类。这些类不会以标准基本类型的形式结束。


0

是的。在您上面的代码中,_ip将被默认构造,然后使用赋值运算符将一个新字符串ip分配给它。如果您在初始化列表中初始化_ip,则可以保存字符串的默认构造,这将节省函数调用和可能的堆分配。初始化程序列表中的初始程序按照类声明中声明成员的顺序进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接