C++学习(三) 构造函数、析构函数、拷贝构造函数

1、构造函数

1.1、作用

为对象分配空间,进行初始化。

1.2、说明

(1)、构造函数必须与类名相同,而不能由用户任意命名。
(2)、构造函数可以有任意类型的参数,但不能具有返回值。
(3)、构造函数不需要用户来调用,而是在建立对象时自动使用。
(4)、构造函数的函数体可以写在类体内,也可以写在类体外。
(5)、构造函数可以不带参数。

1.3、带有默认参数的构造函数

设置默认参数后,调用时不传递实参,将使用默认值

class score{
   publicscore(int a=0int b=0)  //构造函数 score()默认值设为 0
     ...
}

2、析构函数

2.1、作用

通常用于撤销对象时的一些清理任务,如释放分配给对象的内存空间。

2.2、说明

(1)、析构函数与构造函数的名字相同,但它前面必须加一个波浪号(~)。

例如:
构造函数 score();
析构函数 ~score();

(2)、析构函数没有参数,也没有返回值,而且不能重载。因此一个类里面只能有一个析构函数。
(3)、当撤销对象时,编译系统会自动调用析构函数。

2.3、构造函数与析构函数的用法
class score{
   publicscore(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;
   }
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值