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