我爱电脑技术论坛's Archiver

swz 发表于 2008-8-1 19:57

小议C++中类数据成员的初始化

C++最大的特色就是实现了类的封装 数据隐藏  继承及多态,使得代码很容易维护及高度的可重用,在类定义时候,类成员数据不能再声明的时候同时初始化,这个时候为了初始化数据成员我们就需要显示的定义构造函数来对数据成员进行初始化工作,如果用户不显示定义构造函数,系统将默认调用一个构造函数用于对象的创建但不进行初始化工作
     类的成员分为数据成员和成员函数,数据成员一般分为普通数据成员  对象成员和基类成员,普通曾远是指类中的一般数据成员,独享成员是指该类的数据成员为另一个类的对象,基类成员是指从基类继承而来的成员:

  ec:

        class abc

{

   public:double x,y;

   abc()

        {

              x=0;y=0;

         }

};

       class bcd

{

public:double i;

          bcd(){............}

};

public fff:public bcd  //定义派生类fff

{

  public:double z;

            abc object;}



程序分析:

    abc()  bcd() 定义构造函数并对成员数据初始化(后面讨论)  再派生类fff中 object为对象成员 i为基类成员(从类bcd继承而来)

  现在我们看看数据成员的初始化:

      一般说类的数据成员构造方法有两种,一种是再构造函数的函数体中通过直接赋值语句进行,;另一种是使用成员初始化法,成员是初始化式列表是已冒号打头,由多个以逗号分隔的初始化项构成,位于构造函数的形参表和函数体之间,初始化项的使用格式是对象成原名或基类构造函数名,派生类的数据成员再进行对象构造的时候总是先进行基类的对象构造,以及关于通过派生类对基类赋值我们再下面就简单的介绍三种方式

现在我们看个例子:

        #include "iostream.h"

class base
{

  int age;

  public:

base (int k)

   {

          age=k;count<<"base"<<ageMM"\n"; // 成员数据的初始化

  }

};

class text

{

  int i;

public;

text(int k){ i=k;cout<<"text"<<i<<"\n";}

class dy:public base

{

int dt1,dt2;

text te;

public:

dy(int k1,int k2,int k3,int k4):dt1(k1),te(k2),base(k3)//成员初始化数据成员

    {

        dt2=k4;//构造函数体通过赋值语句初始化数据成员

        cout<<"dy"<<dt1<<""<<dt2<<endl;

    }

main()

{

  dy a(11,22,33,44);

}

程序编译后执行的结果是:

   base 33   text  22  dy 11  44

程序是通过成员初始化进行数据初始化的 现在我们在看看一个通过构造函数初始化的:

   .......

class abc

{ int x;

int y;

public:

  abc(int i,int k);//定义带参数的构造函数

};



main()

{

  abc object1(10.20);//对象

  cout<<"inside main()\n";

}

class abc::abc(int i,int k)

{

  x=i;

  y=k;

cout<<"x="<<x<<"y="<<y<<endl;

}        //初始化数据成员



程序输出:

inside main()

x=10  y=20



创建的对象的时候调用构造函数,其中要注意的是每个成员初始化的顺序要和他们声明的顺序相同,首先创建object1对象的成员x,y后在通过构造函数定义吧10 20 分别赋值给x  y

同时可以通过再构造函数中设置默认值来初始化参数:

  将上面的成语abc(int i,int k=50) //设置默认参数k=50

  abc object1(10) //定义对象

其他不变这个时候输出结果为

inside main()

x=10  y=50 // 对于对象object1此时 x=10,而y在对象中为给出值则采用构造函数默认的值50  

  关于再函数中设置默认值的问题,大家需要注意两点:

  1.默认值再函数声明时候给出,定义时候给出编译器会提示错误

  2.只有后面几个参数可以设置默认值,像给i赋值则编译器会提示错误





关于数据成员初始化中存在的问题和解决的方法:

  从开始我们知道在类中定义的是数据类型不能直接定义初始化,而再定义常量和引用变量时必须初始化,这样一来类的数据成员是常量或引用变量时就回产生矛盾,解决的办法就是采用成员初始化方法进行初始化“

class abc

{

   const int num1;

   double num2;

   int &num3;

public:

   abc(int a1,int a2 , int a3):num1(a1),num2(a2),num3(a3)

{

num2=a2;

}

};



上面我们说的都是基于单类的数据成员初始化 现在我们提下关于通过派生类实现基类的数据成员初始化;三种方法:

1.通过下列形式:

  c派生类类名::派生类构造函数(带参):基类构造函数

{ 。。。。。。。。。}



看例子:

class one

{

                int a;

                public :

                one (int i);

}

class one1

{

             int b;

             public:

             one1(int k);

}

main()

{

      one1  abc(10);//声明派生类对象abc

    }

one::one(int i)

{ a=i;cout<<"a="<<a<<endl;}



one1::one1(int k):one(k)   //该程序的关键 由派生类传递值给基类初始化

{b=k;cout<<"b="<<b;}



程序结果输出:

a=10  b=10



2.常量声明

直接修改下上面的程序把one1::one1(int k):one(k) 中的one(k)的k值改成一个常量

3.通过全局参数来传递

方法:定义一个全局参数 int t=20;

把one1::one1(int k):one(k) ---》one1::one1(int k):one(t)

页: [1]
 

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.