《类和对象+四个默认函数+运算符重载》

类和对象:

  • 基础知识: c++中的类与c中的自定义结构体类型非常相似,但类中比结构体类型多了对数据的操作(成员函数),众所周知c是面向过程的语言,数据与操作是分离的,而c++是面向对象的语言,c++中类充分体现了面向对象的思想,将数据和操作同时封装在类中以提高程序的复用性、灵活性和扩展性。类类似于现实世界中建造大楼的设计图纸,有了图纸我们就可以建造出类似的多栋大楼,建造出来的每栋大楼就类似于类的每个实例化出的对象,即:通过类我们可实例化出多个相似的对象 。
  • 类的定义: 定义一个类需要包含class关键字+类名+访问限定符(缺省为私有)+成员函数+成员变量;在类外定义成员需使用::作用域解析符指定成员属于哪个类,一个简单的日期类如下所示:
class Date//class+类名
{
public://访问限定符--公有(类外的接口)
    void SetDate(int year, int month, int day)//成员函数
    {
        _year = year;
        _month = month;
        _day = day;
    }
private://访问限定符--私有
    int _year;//年//成员变量
    int _month;//月
    int _day;//日
};
  • 访问限定符: c++中类的访问限定符共有三种:公有public私有private保护protected;其中通过public定义的公有成员我们可以在类外通过对象+.(对象访问操作符)进行访问,也可通过指向对象的指针+->访问。通过privateprotected定义的私有、保护成员不能从类外进行访问,只能在类内部通过对象或者成员函数进行访问,这恰恰体现了c++封装特性。每个访问限定符可以在类中使用多次,它的作用域是从出现开始至下一个访问限定符出现或者类结尾。如果类中没有定义访问限定符,则默认为私有的。
  • 对象大小的计算:类中并没有定义出成员,只是给出了声明,在类实例化产生对象时才会定义出具体的成员变量,其中成员函数并不是在每一个对象中都定义的,而是放在公共代码区,当需要使用时由具体的对象调用。所以在计算对象的大小时只计算成员变量的大小,当然这里的计算也要符合内存对齐规则。对象的存储如下图所示:
    这里写图片描述

四个默认函数:

  • 构造函数:为了实现对象的封装性,一般会将对象的成员变量定义为私有成员,在类外要初始化这些变量时,应该用一个公有的成员函数来进行,构造函数就是这样一类的函数当且仅当在定义对象时自动执行一次,此类函数称为构 造函数。其特征如下:
    • 函数名与类名相同。
    • 无返回值
    • 构造对象时系统自动调用对应的构造函数。
    • 构造函数支持重载。
    • 如果没有定义构造函数,c++编译系统会自动定义默认的构造函数,但只要我们定义了构造函数编译器便不会定义默认的构造函数。
    • 无参的构造函数和全缺省的构造函数都认为是默认的构造函数,并且默认的构造函数有且只有一个。
class Date//class+类名
{
public://访问限定符--公有(类外的接口)

    Date()//无参构造函数
    {

    }

    Date(int year, int month, int day)//带参构造函数
    {
        _year = year;
        _month = month;
        _day = day;
    }

    Date(int year = 2017, int month = 6, int day = 28)//全缺省构造函数
    {
        _year = year;
        _month = month;
        _day = day;
    }

    Date(int year, int month = 6, int day = 28)//半缺省构造函数
    {
        _year = year;
        _month = month;
        _day = day;
    }
private://访问限定符--私有
    int _year;//年//成员变量
    int _month;//月
    int _day;//日
};

注:其中半缺省构造函数只能从右至左依次缺省,且中间不可出现断连。

  • 拷贝构造函数:构造对象时采用同类对象进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数;其特性如下:
    • 拷贝构造函数是构造函数的重载。
    • 拷贝构造函数的参数必须使用引用传参,不能使用传值方式,否则会出现无穷递归调用。
    • 若没有显式定义拷贝构造函数,编译系统会定义出默认的拷贝构造函数,默认的拷贝构造函数会依次拷贝类的成员变量进行初始化。
    Date(Date& b)//拷贝构造函数
    {
        _year = b._year;
        _month = b._month;
        _day = b._day;
    }
  • 析构函数:当一个对象的生命周期结束时,系统会自动调用一个特殊的成员函数进行一些操作,这个特殊的成员函数就是析构函数;其特性如下:
    • 函数名是在类名前加上~
    • 析构函数无参数、无返回值。
    • 一个类有且仅有一个析构函数,若未显式定义析构函数编译系统会自动定义默认的析构函数。
    • 对象生命周期结束时,系统会自动调用析构函数做一些清理工作。
    ~Date()//析构函数
    {
        //清理工作
    }
  • 运算符重载:为了增强c++程序的可读性,c++支持运算符重载。其特性如下:
    • operator+运算符构成函数的名字,例如:+的重载函数名为operator+
    • 重载运算符后,不能改变运算符的优先级、结合性、操作数。
    Date operator - (Date& b)//-重载函数
    {
        Date tmp;
        tmp._year = _year - b._year;
        tmp._month = _month - b._month;
        tmp._day = _day - b._day;
        return tmp;
    }
  • 赋值运算符重载:赋值运算符的重载,用于一个已存在的对象对另外一个已存在的对象进行拷贝赋值,与拷贝构造函数的根本区别在于被赋值的对象已经存在。
    Date& operator = (Date& b)//=重载
    {
        _year = b._year;
        _month = b._month;
        _day = b._day;
        return *this;
    }

this指针:每个非静态成员函数都隐含一个this指针参数,这个参数是函数的第一个参数由编译器隐式定义,且this指针参数不能由用户显示定义,这个指针指向调用此函数的对象,同时c++支持运算符重载的目的是增强程序的可读性,所以编译器支持a = b;这种方式调用运算符函数,编译器将对a = b;进行转换,转换结果如下图所示:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值