构造函数(可重载)

重载规则

1 函数名相同。
2 参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
3 返回值类型不同则不可以构成重载

无参构造

(系统默认构造函数)

类名()

{ 函数体 }

注意:一旦定义了构造函数,默认构造函数就不存在了!

含参构造

类名(形式参数列表)

{ 函数体 }

参数初始化表的特殊形式

类名(参数):数据成员名1(初始化值),数据成员名2()…

{ 函数体 }

说明:如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值,而不是在参数初始化表中对其初始化。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class Student

{public:

Student(int n,chars,nam[]):num(n),sex(s)

{strcpy(name,nam);}

private:

int num;

char sex;

char name[20];

};

构造函数默认值

C++函数的默认参数指的是在函数声明或者定义时给形式参数指定默认值,,从而在调用参数时可以少写参数,少掉的参数用默认值代替。

注意:

1、函数的默认参数只能指定一次,所以一般是在声明中;

2、声明中的任何一个默认参数右边的参数都必须全部是默认参数,也就是默认参数必须从最右边开始连续指定

3、调用时任何一个给出值的参数左边的参数都必须全部给出具体值,也就是从左边开始连续给出参数值,不能隔空跳过。

实列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 #include <iostream>
using namespace std;
class Box{
public:
Box(int h=2,int w=2,int l=2);//在声明构造函数时指定默认参数
int volume();
private:
int height,width,length;
};
Box::Box(int h,int w,int len){//在定义函数时可以不指定默认参数
height=h;
width=w;
length=len;
}
int Box::volume(){
return height*width*length;
}
int main(){
Box box1(1);//不指定第2、3个实参
cout<<"box1's volume: "<<box1.volume()<<endl;
Box box2(1,3);// 不指定第3个实参
cout<<"box2's volume: "<<box2.volume()<<endl;
Box box3;
cout<<"box3's volume:"<<box3.volume()<<endl;
return 0;

析构函数

格式

~类名()

{ 函数体 }

①析构函数与类名同名
②析构函数无参(不可重载

注意:

对象的释放顺序严格与定义顺序相反

(即析构函数的调用顺序严格与构造函数相反)

可以理解为栈(先入后出)

作用

销毁动态分配的资源

默认析构函数

~类名()

{ }

注意:不能释放由new分配的空间,显式使用delete运算符来释放

构造函数使用new分配的内存

局部对象:在函数内用类名定义的对象
全局对象:在函数外用类名定义的对象
i:局部对象在函数运行完成时要释放
全局对象在整个程序执行完成后释放
ii:全局对象在编译阶段即分配单元

示例:类内new在类内delete

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
class Myclass{
private:
int *px;
public:
Myclass(){
px=new int(3);
}
void Print()
{
cout<<*px<<endl;
}
~Myclass()
{
delete px;
}
};
int main()
{
Myclass my;
my.Print();
}

补充:构造函数==构造器

析构函数==析构器