实例解说构造函数 复制构造函数 赋值运算符 析构函数

今天是秋分,在 这一天里太阳直射赤道,形成昼夜等长,一天24小时昼夜均分为12小时,自秋分其往后天气渐凉。

我在工作中会遇到对定额工时的处理,包括工时的加减乘倍等处理,其正则表达式表示为"^/d+:[0-5]/d$",如"0:00", "16:59", "2:40"等。下面就以此为例解说类的构造函数,复制构造函数,赋值运算符,析构函数。在这个类中包含两个私有成员数据m_ration和m_minutes,前者用于表示工时的字符串而后者则是工时换算成的分钟数。

一. 构造函数(constructor)
    构造函数与其它函数有以下两点不同:1.构造函数的名称必须与类的名相同。2.构造函数不能有返回值。另外构造函数可以重载

CRation(void);        // 默认构造函数   
CRation(std::string); // 用string做参数
CRation(const char*); // 用常量字符串做参数
CRation(int);         // 用int型的分钟数做参数
CRation::CRation() : m_minute(0), m_ration("0:00")
{
}

CRation::CRation(string ration)
{
    create(ration);
}

CRation::CRation(const char *ration)
{
    if(!ration)
    {
        m_minute = 0;
        m_ration = "0:00";
    }
    else
        create(ration);
}

CRation::CRation(int minutes)
{
    m_minute = minutes;
    get_Ration();
}

CRation ra1;
CRation ra2("2:40");
string str;
CRation ra3(str);
CRation ra4(100);

二. 复制构造函数(copy constructor)
    复制构造函数也是与类的名称相同的成员函数,它的作用是用来复制一个已经存在的同类型对象,并用它来初始化一个新的对象,因此 复制构造函数只有一个参数,该参数通常是一个常量引用类型。在实际使用中 复制构造函数分为显示复制和隐式复制两种,用一个对象初始化另一个对象称为显示复制,而把一个对象的值作为参数传递给函数,或从函数中通过传值返回一个对象称为隐式复制。
CRation(const CRation&);
CRation::CRation(const CRation &rhs)
{
    m_minute = rhs.get_Minute();
    m_ration = rhs.getRation();
}

CRation ra1;
CRation ra2 = ra1;  // 显示复制

三. 赋值运算符
   
赋值运算符必须是一个类的成员函数,必须有一个返回值。 每个类都可以定义几种不同的赋值运算符(operator=),但其中以一个指向类自身的常量引用比较特别, 它定义了把一个类对象赋给另一个类对象时的操作, 如果你没有定义那编译器会自动为你生成一个。
CRation& operator=(const CRation&); // 默认类型的 赋值运算符
CRation& operator=(const char*);    // 其它类型的
赋值运算符

CRation& CRation::operator =(const CRation &rhs)
{
    if(this == &rhs)
        return *this;
    m_minute = rhs.get_Minute();
    m_ration = rhs.getRation();
    return *this;
}

CRation& CRation::operator =(const char *rhs)
{
    create(rhs);
    return *this;
}

CRation ra1("4:20");
CRation ra2 = "8:40";
ra2 = ra1;    // ra2等于"4:20" 调用 CRation& operator=(const CRation&);
ra2 = "0:00"; // ra2等于"0:00" 直接调用
CRation& operator=(const char*);

复制构造函数与 赋值运算符的区别:赋值总是把一个已经存在的值(运算符左侧的对象)清除,然后以一个新的值( 运算符右侧的对象 )取代。而在进行复制时先创建一个新的对象,所以不需要对一个已经存在的对象进行清除操作。

四. 析构函数(destructor)
    析构函数没有任何参数,没有返回值。作用是在一个对象删除时被自动调用用以释放对象所占用的资源。
~CRation(void);
复制构造函数,赋值运算符,析构函数三者间关系密切,如果一个类需要析构函数,那么它可能同时也需要一个复制构造函数和一个赋值运算符。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值