zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    event.keycode大全(javascript) (转)
    Javascript 中的 字符串对象 toUpperCase() toString() charAt() indexOf() lastIndexOf() replace() search() substring()
    Javascript 中的 var
    Javascript 中的 Array
    super() (1)
    Javascript 中的事件
    JavaScript验证函数大全 (转)
    javascript数字验证(转)
    Javascript 中 null 与 undefined关系
    Javascript 中的 for ... in
  • 原文地址:https://www.cnblogs.com/wangchaomahan/p/10198706.html
Copyright © 2011-2022 走看看