#include#include using namespace std; class Dummy{ public: Dummy(const char* str) :m_str(str),m_len(m_str.size()){} size_t m_len; string m_str; }; int main(){ Dummy d("hello"); cout << d.m_str << "," << d.m_len << endl; return 0; }
答案:hello,0
分析:
成员变量m_str正常输出"hello",但是为什么m_len长度为0呢?因为初始化列表中初始化顺序是按照成员变量声明的顺序来进行初始化的.先被初始化的是m_len,此时m_str还未被初始化,因此通过m_str.size()求出来的m_len长度是未知的,可能是0也可能是别的结果.m_len初始化完,接着会继续初始化m_str.因此我们看到输出结果是:hello,0
解决办法有2种:
1)将声明的顺序调换一下,先声明m_str再声明m_len,如下:
#include#include using namespace std; class Dummy{ public: Dummy(const char* str) :m_str(str),m_len(m_str.size()){} string m_str; size_t m_len; }; int main(){ Dummy d("hello"); cout << d.m_str << "," << d.m_len << endl; return 0; }
2)通过形参来求得m_len的长度,这样就无关成员变量声明的顺序
#include#include using namespace std; class Dummy{ public: Dummy(const char* str) //:m_str(str),m_len(m_str.size()){} :m_str(str),m_len(strlen(str)){} size_t m_len; string m_str; }; int main(){ Dummy d("hello"); cout << d.m_str << "," << d.m_len << endl; return 0; }
通过以上2种方式均能得到预期的结果:hello,5



