构造函数、拷贝析构函数和析构函数

 

构造函数

在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。

一次可以做一些预先做的动作,就是用来初始化的。

在对象创建的时候由系统自动调用。也就是说不需要需要命令调用。

如果没有声明,则系统自动产生一个缺省形式(NULL的构造函数,这个函数是什么都不干的。

构造函数允许为内联函数,重载函数、带缺省参数值的函数。

构造函数举例:

 

14

  1. class Clock
  2. {
  3. public:
  4. Clock (int NewH,int NewM,int NewS);
  5. /*构造函数的声明:他的名称和类的名称是一样的,
  6. 他和普通函数的区别就是构造函数没有返回值*/
  7. void SetTime(int NewsH,int NewM,int NewS);
  8. void ShowTime();
  9. private:
  10. int Hour,Minute,Second;
  11. };
  12. //构造函数的实现,就是下面{}部分
  13. Clock::Clock(int NewH, int NewM,int News)
  14. {
  15.     Hour =NewH;
  16.     Minute=NewM;
  17.     Sencond=NewS;
  18. }
  19. //建立对象时构造函数的作用
  20. void main()
  21. {
  22.     Clock c(0,0,0);//隐含调用构造函数,将初始值作为实参。
  23.     c.ShowTime();
  24. }

 

拷贝构造函数

是一种特殊的构造函数,其形参为本类的对象引用。

class 类名

{

public

类名(形参);//构造函数

类名(类名&对象名);//拷贝构造函数,这是声明部分

};

类名::类名(类名&对象名);   //拷贝构造函数的实现,这是实现部分

{函数体

 

例:拷贝构造函数举例

 

  1. class Point
  2. {
  3. public:
  4.     Point (int xx=0,int yy=0)
  5. {X=xx;Y=yy;}
  6. Point (Point & p);  //
  7. int GetX( ) {return X;}
  8. int GetY( ) {return Y;}
  9. private:
  10.     int X,Y;
  11. };
  12. //实现部分
  13. Point::Point(Point & p)
  14. {
  15.     X=p.X;
  16.     Y=p.Y;
  17.     cout<<”…”<<endl;
  18. }

举例二

当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝复制

 

  1. void main()
  2. {   Point A(1,2);//构造函数x是1,y是2
  3.     PointB(A);  //拷贝构造函数被调用,表示把A作模板来生成B,B完全等于A
  4.     cout << B.GetX()<<endl;
  5. }

举例三

若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。

 

  1. void fun1(Point p) //函数叫fun1 函数的参数是一个类
  2. {       cout <<p.Get ( ) <<endl;
  3. }
  4. void main( )
  5. {   Point A(1,2);
  6.     fun1(A);    //调用对象的时候就会自动调用拷贝构造函数
  7. }

当函数的返回值是类对象时,系统自动调用拷贝构造函数

:

 

  1. Point fun2( )  //返回值Point本身就是一个类对象
  2. {
  3.     Point A(1,2);
  4.     return A;       //调用拷贝构造函数
  5. }
  6. void main()
  7. {   
  8.     Point B;
  9.     b=fun2( );//把fun2的拷贝结果赋给b
  10. }

总结:

3中情形要用拷贝函数

1、  B生成A

2、  在函数里,参数本身是对象

3、  函数返回是一个对象

如果程序员不写拷贝构造函数,则编译器自己生成一个拷贝构造函数。

这个函数的功能是:用作为初始化值的对象的每个数据成员的值,初始化将要建立的独享的对应数据成员。

 

析构函数

destruct

完成对象被删除钱的一些清理工作

在对象的生存其结束的时刻系统自动调用它,然后在释放此对象所属的空间。

如果程序中为声明析构函数,编译器将自动产生一个缺省的析构函数。

 

举例:

 

  1. #include<iostream.h>
  2. class Point
  3. {   
  4. public:
  5.     Point (int xx,int yy);
  6.     ~Point();
  7.     //…其他函数原型
  8. private:
  9.     int X,int Y;
  10. }

举例:

  1. #include <iostream.h>
  2. const float PI = 3.14;
  3. const float FencePrice = 35;
  4. const float ConcretePrice = 20;
  5. //声明类Circle
  6. class Circle
  7. {   
  8.     private:
  9. float radius;
  10. public:
  11. Circle(float r);//构造函数
  12. float Circumference () const ; //周长
  13. float Area() const;  //面积
  14. //类的是想
  15. //构造函数初始化数据成员radius
  16. Circle::Circle (float r)
  17. {radius =r}
  18. //计算周长
  19. float Circle::Circumference() const
  20. {
  21.     return 2*PI*radius;
  22. }
  23. //计算圆的面积
  24. float Circle :: Area () const
  25. {
  26.     return PI*radius*radius;
  27. }
  28. //调用
  29. void main()
  30. {
  31.     float radius;
  32.     float Fencecost,ConcreteCost;
  33. //输入半径
  34. cout <<”Enter the radius of the pool:”;
  35. cin>radius;
  36. //声明Circle对象
  37. Circle Pool (radius);       //定义游泳池对象
  38. Circle PoolRim(radius +3);      //外边对象
  39. //计算栅栏造价
  40. FenceCost =PoolRim.Circumference() *FencePrice;
  41. cout <<”Fencing Cost is $” <<FenceCost <<endl;
  42. //计算过道造价
  43. ConcreteCost =(PoolRim.Area() – Pool.Area() ) *ConcretePrice;
  44. cout <<”Concrete Cost is $”<<ConcreteCost<<endl;
  45. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值