C++ 构造器,这段代码错误原因,以及解决方案

 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 }

 

posted on 2018-12-30 10:20  王朝马汉  阅读(263)  评论(0编辑  收藏  举报

导航