C++构造函数

class Thing

{

public:

Thing( int a=10,int b=20, int c = 30)

//Thing( int a, int b, int c)

        { x=a; y=b; z=c; } 

比较两个构造函数头,调用时的区别是什么?

  在有参构造函数调用时,如果参数有默认值,则是如下调用的话,Thingt;则系统会自动的调用这个带有三个默认值的构造函数,对象没有参数,一个,两个,三个都会调用此函数。

 void printThing()

      {cout<<"x="<<x<<"y="<<y<<

"z="<<z<<endl;}//bad practice

private:

    intx; int y; int z;

};

 

int main()

{

Thing t;

   t.printThing();

 

   Thing s(1);

   s.printThing();

 

   Thing r(1,2);

   r.printThing();

 

   Thing v(1,2,3);

   v.printThing();

return 0;

}

OUTPUT

x= 10 y= 20 z= 30

x=  1 y= 20 z= 30

x=  1 y=  2z= 30

x=  1 y=  2z=  3

重载构造函数

重载构造函数必须有不同的参数列表,与返回值无关!

 

class Thing

{

  public:

   Thing( ) {x =0; y= 0; z=0;}  //default constructor

 

   Thing(int a){ x=a;}

 

   Thing(int a, int b) {x=a;y=b;}

 

   Thing(int a, int b, int c)

                     {x=a;y=b;z=c;}

 

   voidprintThing(){cout<<"x="<<x<<

"y="<<y<<" z="<<z<<endl;}

 

private:

    int x;

int y;

int z;

};

 

初始化列表

在构造函数头的位置,对类的成员变量进行初始化,叫做初始化列表。

初始化列表的格式为 :成员变量(赋给成员变量的值)

 

初始化列表优势:1.效率高  2.有一些类型的成员变量,只能用参数化列表的方式初始化,如const、引用

 

class Point

{

public:

   Point() { x =0; y = 0; }

Point(floatx_centre, float y_centre)

{

x=x_centre;

y=y_centre;

}

 

void printPoint() const { cout << "  x=" << x <<

 

                       " y=" <<y << endl;}

// const成员函数:成员函数体内,不能修改这个类的成员变量的值

//printPoint里不可以修改x y 的值

private:

   floatx;

floaty;

};

 

 

 

 

class Circle

// A Circle object is a radius and a centre

{

public:

Circle():point(){}; //defaultconstructor

 

Circle(floatx_centre,float y_centre,float r)

      :point(x_centre,y_centre) { radius =r;}

   //初始化列表,在Circle的构造函数里,

//调用了Point类的构造函数,并传递相应的参数,给Point的

//成员变量赋值。

//初始化列表的赋值先发生

void setCircle(float r, Point p )//const

   {

radius= r;

     point = p; //圆心

}

 

 

void printCircle() const

//不能通过成员函数修改成员变量的值

//当你不需要在成员函数里修改成员变量的值的时候,建议加上const,可以增加程序的健壮性(鲁棒性)。

   {

cout<< "radius:"<<radius;

     point.printPoint();

      

}

 

private:

   floatradius;

   Point point;

};

 

void main()

{

   Circle c;//定义一个对象,调用两个构造函数

               //当创建复合类的对象时,不仅调用复合类本身的构造函数,

              //还将调用复合类的类类型的成员变量的默认构造函数。

      c.printCircle();

   Point p(5,7);

   p.printPoint();

   c.setCircle(10,p);

   c.printCircle();

 

   Circlec2(33.0,44.0,55.0);

   c2.printCircle();

   //关于const成员函数增加的代码

     constCircle c3( 1, 2, 3 );

//const对象,只能调用const修饰的成员函数,const位于函数小括号

//后面。普通对象,可以调用const成员函数和非const成员函数。

     c3.printCircle();

 

     constCircle& c4 = c3;

//const对象,只能赋值给const类型的引用,而不能赋值给普通引用。

 

     c4.printCircle();

 

//指向常量的指针,即指针指向对象的值不能修改,但可以指向别的对象。

     constCircle* c5 = &c2;

     c5->printCircle();

 

//常量指针,c6不能指向别的对象,但是可以修改指向对象的值。

Circle * const c6 =&c1;

Circle* const cp = &c2;//cp只能指向非cosnt对象。

cp->printCircle();

cp->setCircle( 10,p);

   //Circle*const p = &c3; //不可以,原因这样有可能会变成可以更改的

const Circle* const pp = &c3;//定义成双cosnt就可以了。

   //cp =&c3;

 

根据const的位置,区分到底哪个是常量——const后面紧跟着的那个就是常量。

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值