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 }