在一个类的构造函数中初始化一个CRect类的对象:
为什么必须写成
class::class():m_rect(0,0,200,200)
{}
而不能写成
class::class()
{
  CRect m_rect(0,0,200,200);  
}

解决方案 »

  1.   

    第二种写法是完全生成一个新的 CRect 了。
      

  2.   

    在C++的语法中第一种方法是初始化类的一个变量,而第二种方法则是在构造函数中另外定义了一个CRect变量,并不是类class的对象。
      

  3.   

    可以这么写
    class:class()
    {
    m_rect.SetRect(0, 0, 200, 200);
    }
      

  4.   

    class::class()
    {
      CRect m_rect(0,0,200,200);  
    }
    仅仅是声明一个局部变量

    class::class():m_rect(0,0,200,200)
    {}
    是初始化类成员
      

  5.   

    楼上说的没错
    还可以这样写class::class()
    {
      m_rect.topLeft= (0,0);
      m_rect.bottomRight= (200,200);
    }
      

  6.   

    而不能写成
    class::class()
    {
      CRect m_rect(0,0,200,200);  
    }
    >>>>>>>>你还没有分清楚 变量的作用域。成员变量是要在对象的空间内有效的。CRect m_rect(0,0,200,200); 你的函数中的,这个变量只在构造函数中有效。
     
      

  7.   

    第二个是在构造函数范围内生成一个局部变量而已
    可以
    class::class()
    {
     m_rect = CRect(0,0,200,200);  
    }
    不过这样比第一种效率低,多了一次拷贝
      

  8.   

    class::class():m_rect(0,0,200,200){}
    而不能写成
    class::class()
    {
      CRect m_rect(0,0,200,200);//这个只是产生了一个临时的m_rect
    }
    楼主问的估计不是这个意思
    假设
    class::class()
    {
      m_xxx=XXX;//这里不是对m_xxx进行初始化,此时的m_xxx已经调用了默认的构造函数了!!!
                //这里只是operator=而已.
    }
    一般对于一个class中,有另一个class的object作为成员变量,这个object的初始化要在成员变量初始化表中.
      

  9.   


    首先要告诉你的是:
    class::class()
    {
      CRect m_rect(0,0,200,200);//这个只是产生了一个临时的m_rect
    }
    m_rect在class::class()函数结束后将析构,也就是说这个对象就不存在了.再举个例子:
    int a=100;
    {
    int a=70;
    cout<<a<<endl;//输出70
    }
    cout<<a<<endl;//输出100
    你可以试试,因为第二个a在括号之外就没有作用域了, 你可以看看作用域方面的书,很多c++教程都有.
    然后,class::class():m_rect(...)是初始化变量(m_rect 在类中要有定义哦).
    他的作用是很明显的,比如:
    class cls
    {
    const int a;
    public:
    cls(int param):a(param){};//chu shi hua,正确.
    };
    一个const 成员如果你这样:cls::cls(int param){a=param;} //error,因为不能给一个const成员复值.
    所以,很多地方要用到初始化的.
    说这么多不知道你乐不乐意看完,但是,这是一些很基础的东西,一定要懂的
    你可以参考<<c++对象模型>>,侯杰翻译的.