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 }
  • 相关阅读:
    Python实现将IP地址转换为数字
    转 python两个 list 获取交集,并集,差集的方法
    并发编程之协程
    网络编程之协议
    网络编程
    python之路-模块和包
    python IO模型
    python 线程(队列,线程池),协程(理论greenlet,gevent模块,)
    python 线程(部分)Thread的使用,守护线程,互斥锁,递归锁,信号量,事件,条件,定时器
    常见的面试题
  • 原文地址:https://www.cnblogs.com/wangchaomahan/p/10198706.html
Copyright © 2011-2022 走看看