構(gòu)造函數(shù)
- 函數(shù)名與類名相同,沒有返回值。相當(dāng)于將對(duì)象初始化
class Circle
{
public:
Circle()
{
x = y = 0;
radius = 1;
}
public:
int x,y;
int radius;
};
構(gòu)造函數(shù)可以重載,只要參數(shù)列表不同就行
class Circle
{
public:
Circle()
{
x = y = 0;
radius = 1;
}
Circle(int x,int y,int r)
{
this->x = x;
this->y = y;
this->radius = r;
}
public:
int x,y;
int radius;
};
int main()
{
Circle a;
Circle b(1,1,4);
return 0;
}
int a(10);//就是int a = 10;
構(gòu)造函數(shù)保證了對(duì)象一被創(chuàng)建就是被初始化的,可以避免忘記初始化產(chǎn)生錯(cuò)誤
析構(gòu)函數(shù)
析構(gòu)是構(gòu)造的反過程,表示對(duì)象的銷毀過程。析構(gòu)函數(shù)只能有一個(gè),不允許重載
class Object
{
public:
~Object()
{
printf("...銷毀...\n")
}
}
自動(dòng)生成的構(gòu)造/析構(gòu)函數(shù)
如果程序沒有構(gòu)造函數(shù)/析構(gòu)函數(shù),那么編譯器會(huì)隱含地添加一個(gè),相當(dāng)于寫了一個(gè)空的構(gòu)造/析構(gòu)函數(shù)
class Object
{
public:
Object()
{
}
~Object()
{
}
}
構(gòu)造函數(shù)的初始化列表
class Circle
{
public:
Circle():x(0),y(0),radius(1)
{
//x = y = 0; radius = 1;
}
private:
int x,y;
int radius;
};
必須使用初始化列表的情況:當(dāng)成員為引用類型
#include<stdio.h>
class Object
{
public:
Object(int& a):ref(a)
{
}
private:
int& ref;
}
int main()
{
int value = 1;
Object obj(value);
return 0;
}
構(gòu)造和析構(gòu)的順序
#include<stdio.h>
class ChildA
{
public:
ChildA()
{
printf("創(chuàng)建A...\n");
}
~ChildA()
{
printf("銷毀A...\n");
}
};
class ChildB
{
public:
ChildB()
{
printf("創(chuàng)建B...\n");
}
~ChildB()
{
printf("銷毀B...\n");
}
};
class Object
{
public:
Object()
{
printf("創(chuàng)建Object...\n");
}
~Object()
{
printf("銷毀Object...\n");
}
private:
ChildA a;
ChildB b;
};
int main()
{
Object obj;
return 0;
}
上述運(yùn)行結(jié)果為
//只有A和B創(chuàng)建之后,Object才能創(chuàng)建
創(chuàng)建A...
創(chuàng)建B...
創(chuàng)建Object...
銷毀Object...
銷毀B...
銷毀A...