构造函数与析构函数

一、构造函数     创建对象时:系统自动调构造函数

与类名一样。

class Date
{ 
   Date(int,int,int);  //后边略

};
Date::Date(int y,int m,int t)  //带参数的构造函数
{  
  year=y; month=n; day=t;
} 

有带参和不带参的,默认构造函数的。

二、拷贝构造函数:

用已经存在的类的对象去构建一个新的对象,两个对象的数据成员值是完全相同的

(1)声明格式:Point(Point &) 或 Point(const Point &)

使用系统提供的拷贝构造函数(因为类中没有定义拷贝构造函数

#include <iostream>
#include<string>
#include<iomanip>
//使用系统提供的拷贝构造函数(因为类中没有定义拷贝构造函数)
using namespace std;
class Point
{
public:
    Point(int xx=0,int yy=0)
    {
        X=xx;
        Y=yy;
    }
    int GetX(){return X;}
    int GetY(){return Y;}
private :
    int X,Y;
};
int main()
{
    Point A(1,2);//创建一个A对象;
    Point B(A); //系统提供的拷贝函数被调用
    cout<<A.GetX()<<","<<A.GetY()<<endl;
    cout<<B.GetX()<<","<<B.GetY()<<endl;
    return 0;
}
 结果: 1,2
        1,2

构造函数被调用的情况:

#include <iostream>
//构造函数被调用的情况
using namespace std;
class Point
{
public:
    Point (int xx=0,int yy=0){X=xx;Y=yy;}
    Point (Point &p);  //拷贝构造
    int GetX(){return X;}
    int GetY(){return Y;}
    void SetX(int x){X=x;}
    void SetY(int y){Y=y;}

private:
    int X,Y;
};
Point::Point(Point &p)
{
    X=p.X; Y=p.Y;
}
Point Fun(Point p)  //返回类型为Point的函数
{
    Point p1;
    p1.SetX(p.GetX()+3);
    p1.SetY(p.GetY()+3);
    return p1;
}
int main()
{
    Point A(1,2);
    Point B(A);   //A等于p   所以 X=A.X
    Point C;
    C=Fun(A);
    cout<<B.GetX()<<","<<B.GetY()<<endl;
    cout<<C.GetX()<<","<<C.GetY()<<endl;
    return 0;
}

拷贝构造函数的3种情况:

1)用已经存在的对象初始化另一个对象;(Point B(A))

2)对象作为实参传递给形参;(Fun(A))

3)对象作为函数返回值;(上边:return p1)

三、析构函数  

用来完成对象被删除前的清楚工作;它的调用完成之后,对象消失,其内存空间释放。

要求:

1)“~”

2)析构函数没有参数,也没有返回值,不能用return返回一个值

3)一个类中只能有一个析构函数,且为public,不可重载

4)析构函数只能由系统调用,不能再程序中显示调用析构函数(就是自己就出来了,别管他了)

5)可以根据需要自定义析构函数

特点:以例子展现   构造函数与析构函数

#include <iostream>
//主要体现构造函数与析构函数顺序的体现
using namespace std;
class Time
{
private:
    int hour,minute,second;
public:
    Time(int h,int m,int s);
    ~Time();  //析构函数声明
};
Time::Time(int h,int m,int s)
{
    hour=h;minute=m;second=s;
    cout<<"这是时间:"<<hour<<":"<<minute<<":"<<second<<endl;
}
Time::~Time()
{
    cout<<"我要释放了 看时间:"<<hour<<":"<<minute<<":"<<second<<endl;
}
class Date
{
    private: int year,month,day;
    public:Date(int y,int m,int d);
    ~Date();
}yesterday(2022,4,2);   //!!!这是个全局变量,请注意!!!
Date::Date(int y,int m,int d)
{
    year=y;month=m;day=d;
    Time time(15,15,15);  //!!!在类Date定义构造函数中定义类Time的对象(局部)
    static Time time1(12,12,12); //!!!在。。。。定义静态对象(局部)
    cout<<"现在日期:"<<year<<"-"<<month<<"-"<<day<<endl;
}
Date::~Date()
{
    cout<<"要释放了 日期:"<<year<<"-"<<month<<"-"<<day<<endl;
}
int main()
{
    cout<<"是从这开始吗?你猜猜"<<endl;
    Date today(2023,13,25);
    cout<<"请问结束吗"<<endl;
    return 0;
}

结果:

这是时间:15:15:15
这是时间:12:12:12
现在日期:2022-4-2
我要释放了 看时间:15:15:15
是从这开始吗?你猜猜
这是时间:15:15:15
现在日期:2023-13-25
我要释放了 看时间:15:15:15
请问结束吗
要释放了 日期:2023-13-25
要释放了 日期:2022-4-2
我要释放了 看时间:12:12:12

! 先构造后析构  后构造先析构 !

1)全局对象:先调用构造函数,在所有函数之前(包括main);当main函数执行完毕或调用exit函数时终止;调用析构函数。

2)静态局部对象:就出现一回;当main函数执行完毕或调用exit函数时终止;调用析构函数。

3)局部对象:出现就调用构造函数,函数完就调用析构函数。(比较折腾)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值