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後面緊跟着的那個就是常量。

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章