1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 class A 5 { 6 public: 7 /* 这段代码运行会崩溃,构造器初始化类的数据成员,只跟数据成员的声明的先后顺序有关 8 A(char * ps) 9 :name(ps),len(strlen(name.c_str())){} 10 11 void dis() 12 { 13 cout<<len<<endl; 14 } 15 private: 16 int len;//len 是第一个声明的数据成员,构造器初始化的时候,一定是第一个初始化len 17 string name; 18 */ 19 /***************解决方案1(推荐)******************/ 20 21 A(char * ps) 22 :name(ps),len(strlen(name.c_str())){}//这种格式下 系统会认为len(strlen(name.c_str())这是初始化len,而不是函数调用。因为没有‘;’ 23 24 void dis() 25 { 26 cout<<len<<endl; 27 } 28 private: 29 string name;//首先声明name ,构造器被调用的时候,会首先初始化name 30 int len; 31 }; 32 /****************解决方案2***********************/ 33 /* 34 A(char * ps) 35 :name(ps) 36 { 37 len = strlen(name.c_str());//放在内部来初始化一定不要写成len(strlen(name.c_str()));系统会认为是一个函数调用。但又找不到实现,报错。 38 } 39 40 void dis() 41 { 42 cout<<len<<endl; 43 } 44 private: 45 int len; 46 string name; 47 };*/ 48 int main() 49 { 50 A a("china");//初始化数据成员,第一个初始化len,但是strlen(name.c_str()) name 并没有被初始化,内部是垃圾值,返回的长度是不确定的 51 //故系统会崩溃, 52 a.dis(); 53 return 0; 54 }