文章目录
1、构造函数
1.1、作用
为对象分配空间,进行初始化。
1.2、说明
(1)、构造函数必须与类名相同,而不能由用户任意命名。
(2)、构造函数可以有任意类型的参数,但不能具有返回值。
(3)、构造函数不需要用户来调用,而是在建立对象时自动使用。
(4)、构造函数的函数体可以写在类体内,也可以写在类体外。
(5)、构造函数可以不带参数。
1.3、带有默认参数的构造函数
设置默认参数后,调用时不传递实参,将使用默认值
class score{
public:
score(int a=0,int b=0) //构造函数 score()默认值设为 0
...
}
2、析构函数
2.1、作用
通常用于撤销对象时的一些清理任务,如释放分配给对象的内存空间。
2.2、说明
(1)、析构函数与构造函数的名字相同,但它前面必须加一个波浪号(~)。
例如:
构造函数 score();
析构函数 ~score();
(2)、析构函数没有参数,也没有返回值,而且不能重载。因此一个类里面只能有一个析构函数。
(3)、当撤销对象时,编译系统会自动调用析构函数。
2.3、构造函数与析构函数的用法
class score{
public:
score(int a,int b); //声明构造函数 score()
~score(); //声明析构函数
...
}
score::score(int a,int b) //定义构造函数 score()
{
...
}
score::~score() //定义析构函数
{
...
}
int main()
{
score s1(10,11); //定义类 score的对象 s1,自动调用构造函数
...
}
构造函数与析构函数的示例代码如下:
#include<iostream>
using namespace std;
class score{ //声明类 score
public: //公有
score(int a,int b); //声明构造函数
~score(); //声明析构函数
void printscore (); //声明 print函数
private: //私有
int mid_exam; //私有成员函数
int fin_exam; //私有成员函数
};
score::score(int a,int b) //定义构造函数
{
cout<<"使用构造函数..."<<endl;
mid_exam=a;
fin_exam=b;
}
score::~score() //定义析构函数
{
cout<<endl<<"使用析构函数..."<<endl;
}
void score::printscore() //定义 print函数
{
cout<<mid_exam<<" "<<fin_exam<<endl;
}
int main()
{
score s1(10,11);
s1.printscore();
score s2(20,21),*ptr1; //指针用法一
ptr1=&s2;
ptr1->printscore();
score *ptr2; //指针用法二
ptr2=new score(30,31);
ptr2->printscore();
delete ptr2;
return 0;
}
运行结果:
使用构造函数...
10 11
使用构造函数...
20 21
使用构造函数...
30 31
使用析构函数...
使用析构函数...
使用析构函数...
3、拷贝构造函数
3.1、作用
建立一个新的对象时,使用一个已经存在的对象去初始化这个对象。
3.2、特点
(1)、因为拷贝构造函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值。
(2)、拷贝构造函数只有一个参数,并且是同类对象的引用。
(3)、每个类都必须有一个拷贝构造函数。可以自定义拷贝构造函数,用于按照需要初始化对象,如果没有定义类的拷贝构造函数,系统就会自动生成一个默认拷贝构造函数,用于复制出于数据成员值完全相同的新对象。
3.3、调用拷贝构造函数的方法
(1)、当类的一个对象去初始化该类的另一个对象时。
代入法调用默认拷贝构造函数,用对象s1初始化s2
score s2(s1);
赋值法调用默认拷贝构造函数,用对象s1初始化s3
score s3=s1;
(2)、当函数的形参是类的对象,调用函数进行形参和实参结合时。
fun1(score s) //形参是类 score的对象s
{ s.d(); }
int main()
{ score s1(10,11); //调用函数 fun1()时,实参s1是类score的对象,
fun1(s1); //调用拷贝构造函数,初始化形参对象 s
return 0;}
(3)、当函数的返回值是对象,函数执行完成返回调用者时。
score fun2()
{ score s1(20,21);
return s1; //函数的返回值是对象
}
int main()
{
score s2;
s2=fun2(); //函数执行完成,返回调用者时,调用拷贝构造函数
return 0;
}