zoukankan      html  css  js  c++  java
  • c++ 类数据成员的定义、声明

    C++为类中提供类成员的初始化列表
    类对象的构造顺序是这样的:
    1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
    2.进入构造函数后在构造函数中执行一般计算
      1.类里面的任何成员变量在定义时是不能初始化的。
      2.一般的数据成员可以在构造函数中初始化。
      3.const数据成员必须在构造函数的初始化列表中初始化。
      4.static要在类的定义外面初始化。   
      5.数组成员是不能在初始化列表里初始化的。
      6.不能给数组指定明显的初始化。  
    这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。这个事情似乎说不过去啊?没有办法,我只好转而求助于静态数据成员。
    到此,我的问题解决。但是我还想趁机复习一下C++类的初始化:
      1.初始化列表:CSomeClass::CSomeClass() : x(0), y(1){}
      2.类外初始化:int CSomeClass::myVar=3;
      3.const常量定义必须初始化,C++类里面使用初始化列表;
      4.C++类不能定义常量数组。
      
    关于const,复习一下常量指针:  
      如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

    在C++类中,必须做如下事情:

    1.必须对任何const或引用类型成员以及没有默认构造函数的 类 类型 的任何成员 显示地使用初始化列表进行初始化

    2.类成员在定义时是不能被初始化的。

    3.类的成员初始化顺序与成员变量在构造函数中的位置选后顺序无关,至于成员变量在类中定义的先后顺序有关。

    所以下面的例子是错的:

    复制代码
     1 class x
     2 
     3 {
     4   int i; 
     6   int j;
     7 
     8 public :
     9   x( int value):j(value),i(j)
    10   {
    11   }
    12 } 
    复制代码

    对与上面的code,因为i先被初始化(i相对于j先定义的)而在i初始化时,j并没有被初始化,故执行出现问题了。

    补充1:

        类非静态成员变量内部初始化是在构造函数中进行,而对于类的静态成员变量,由于其属于类为所有类对象所共有,但不属于任何一个对象,所以不能在类的构造函数中初始化,因为类的构造函数是在定义类的对象时候调用的,而定义类的时候还没有类对象呢,因此类的静态成员变量不能在类内部初始化,只能在类外。

        类静态成员变量在类内需要声明,还要在类外定义或初始化一次,这里的定义可以不初始化,例如当该静态成员为类自身类型(其实适用于任何类型)的时候,在类外可以只定义不初始化。若该静态成员是const类型的,则可以在类的内部初始化(也即此时就不用在类外初始化了,大伙可以自己尝试一下)

    补充2:

    类中的对象成员的定义和初始化:

    1、对象成员初始化时,必须有相应的构造函数,且多个对象成员的构造次序不是按初始化成员列表的顺序,而是按各类声明的先后次序进行的

    2、成员对象初始化可在类构造函数定义时进行

    class CRect  
    {  
    public:  
    CRect(int left, int top, int right, int bottom);  
    void Show() {  
    ptCenter.ShowPos();  
    size.ShowSize();  
    }  
    private:  
    CPoint ptCenter;  
    CSize size;  
    };  
    
    CRect::CRect(int left, int top, int right, int bottom)  :size(right-left, bottom-top), ptCenter((left+right)/2, (top+bottom)/2)  
    {  
    } 
  • 相关阅读:
    在dataGridView中实现批量删除
    VS2005制作简单的安装程序
    [WinForms]
    TreeView的联动复选框
    TreeView
    AcceptChanges()和RejectChanges()
    用C#在WINDOWS中实现新用户帐号的创建
    测试成功的窗体应用[批量新增、删除、保存]
    TreeView的递归读取
    VS2005中部署C#应用程序
  • 原文地址:https://www.cnblogs.com/silentjesse/p/3219193.html
Copyright © 2011-2022 走看看