看了这本书,居然很多东西都不知道,就拿结构体来说吧,本来结构体也可有有构造函数的,但书中只字未提,害得我一直以为C++中的结构体和C语言中的结构体一样只能包含数据成员,过了很久很久才发现原来也可以包含成员函数,晕死,另外象定义结构体成员变量的位域宽度这些知识更是闻所未闻,看来还是建议大学的C++教材改选《21天学通C++》这本书算了,比老谭的写得好多了,不然的话选钱能的也不错,希望人们再也不要迷恋老谭了,另外再问大家一个问题呀,struct CLS
{
  int value;
  CLS(int i):value(i){}
  CLS(){CLS(0);}
}void main()
{
  CLS s;
  cout<<s.value<<endl;
}这段代码输出的为什么是负数而不是0呢,它不是明明调用了CLS(0)的嘛,哎,我不知道的东西太多了,我倒底还有哪些不知道的呀

解决方案 »

  1.   

    CLS(int i):value(i){} 
    CLS(){CLS(0);} 
    下面这个函数,调用上面的那个函数生成另一个实例并初始化,然后立即析构;
    所以最终value没有初始化。
    你添加一个析构函数,然后跟踪就知道了。
      

  2.   

    CLS(){CLS(0);} 
    您在这里相当于又声明了一个CLS 的对象,而这个是局部的,它的作用域仅在CLS()内有效。而到你输出时此时的value是一个没有初始化的值。看下面的代码:
    #include <iostream>
    using namespace std;struct CLS 

      int value; 
      CLS(int i):value(i)
      {
      } 
      CLS()
      {
      CLS ss(0);
      } 
    } ;void main() 

      CLS s; 
      cout <<s.value <<endl; 

    为了便于理解您可以参考下面的代码
    #include <iostream>
    using namespace std;struct CLS 

      int value; 
      CLS(int i):value(i)
      {
      } 
      CLS()
      {
     // CLS (0);
      } 
    } ;void main() 

      CLS s; 
      {
    CLS ss(0);
    cout <<ss.value <<endl; 
      }
      cout <<s.value <<endl; 
      

  3.   

    其实每本书都有它的优劣,老谭写的C语言还行,写的C++受一点C影响也很正常。建议看书还是要看国外的精典教材,国内的入门书基本没有。
    你的问题如楼上所言,下一个构造函数调用上个时只是重新定义了一个对象,而原对象里的i并没有被初始化,所以为负。
      

  4.   

    为什么会立即析构呢,而CLS(0)这样来构造却不析构呢??是不是因为CLS()这样的构造方式,0是保存在CLS这个栈里的,而我定义为CLS s(0)这样,0就是保存在main栈中的,在还没跳出main之前0就不会被回收掉了??
      

  5.   

    CLS(int i):value(i)
    {} 
    CLS()
    {
    CLS(0);//这里就调用上面的构造函数创建了一个新的CLS实例,而且是局部实例,仅仅在CLS()当前函数内有效,随着CLS()函数执行完毕就立即析构。

    你给结构添加一个析构函数,看看this指针就可以发现this指针不同()。
      

  6.   

    CLS(){CLS(0);} -----> CLS(){value = 0;}
      

  7.   

    谭浩强的书还是不错的,我看的就是那个用powerpoint幻灯片做的那个教材,写得算可以的了,叙述比较清晰流畅。内容也挺全。
      

  8.   

    自己都不懂,还说人家书不好
    自己笨就得承认要评价别人时,至少要拿出自己真的实力
    LZ你永远都学不好C++
      

  9.   

        看C++ Prime吧。国内的教程都是一些基础教程,不会介绍太深的东西。当年看孙鑫的VC教程,函数直接写下去,从不判断返回值,他假定每个函数都调用成功了。
        有空的话,把ISO C++ 2006的规范文档看一遍。类定义那一节,规定了C++类有三个关键字class,struct,union。struct和class的唯一区别是struct默认成员变量是公有的,union和struct的唯一区别是,union只能有一个成员变量,或多个变量共用内存。
      

  10.   

    用过C的人做C++都会受到C的影响。谭写C的很经典啊,所以C++可能受影响了。
    虽然我从来没读过任何谭的书,不好评论,但是我认为你还是虚心些为好。
    随便说别人烂只能暴露自己的无知和浅薄。