四个默认成员函数和运算符重载

来源:互联网 发布:还珠格格3知画圆房 编辑:程序博客网 时间:2024/06/02 01:57

一.类和对象的基础知识

1.类的定义

在C++中,用“类”描述“对象”,所谓的对象是指现实世界中的一切事物。
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类的一个具体实例,拥有类的成员变量和成员函数。
类的组成:数据(成员变量)和程序(成员函数)。
例子:

    class person{public:     //成员变量    char* name;    int age;    char* sex;    //成员函数    void display()    {        cout<<name<<age<<sex<<endl;    }};
2.访问限定符

c++中访问限定符有三种:public、private和protected
publiic(共有的): 声明了对类的外部接口,所有来自外部的访问通过接口访问。
private(私有的):只允许本类的成员函数访问,类外部的访问都是非法的。
protected(保护):介于共有的和私有的之间,对除本类和派生类以外都不可访问。
注:
a.public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
b.每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
c.类体中如果没有定义限定符,则默认为私有的。
d.类的访问限定符体现了面向对象的封装性。

3.面向对象封装

封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。

4.类实例化对象

a.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
b.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
例子:

```class person{public:     //成员变量    char* name;    int age;    char* sex;    //成员函数    void display()    {        cout<<name<<age<<sex<<endl;    }};void text(){     person p;  //实例化一个对象p    p.name="小明";    p.age=20;    p.sex="男";    p.display();}

二、四个默认成员函数及运算符重载

Alt text
1)构造函数
私有成员变量要对它们进行初始化,必须用一个公有成员函数进行,同时这个函数应该有且在定义对象时自动执行一次,这是调用的函数称为构造函数。
构造函数是特殊的成员函数,有如下特征:
a.函数名与类名相同。
b.无返回值。
c.对象构造时系统自动调用对应的构造函数。
d.构造函数可以重载。
e.构造函数可以在类中定义,也可以在类外定义。
f.如果类定义中没有给出构造函数,则c++编译器会自动生成一个省缺的构造函数,但只要我们自己定义了一个构造函数,则系统就不会自动生成缺省的构造函数。
g.无参的构造函数和全缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个。
定义一个Date类:

Date()   //无参构造函数{}Date(int year,int month,int day)//带参构造函数{  _year=year;  _month=month;  _day=day;}Date(int year=1990,int month=2,int day=1)//缺省参数的构造函数{    _year=year;    _month=month;    _day=day;}

2).拷贝构造函数.
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数。
拷贝构造函数的特征;
a.拷贝构造函数是一个构造函数的重载,
b.拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用。
c.若未显示定义,系统会自动生成默认缺省的拷贝构造函数.缺省的拷贝构造函数会依次拷贝类成员并进行初始化.
例子:

Date(const Date& d)    {        _year=d._year;        _month=d._month;        _day=d._day;    }    Date d1;    Date d2(d1);//调用拷贝构造函数    Date d3=d1;

3).析构函数。
当一个对象生命周期结束时,系统会自动调用一个成员函数,这个特殊的成员函数即析构函数。
析构函数的特点:
a.析构函数在类名前加上~。
b.析构函数无参数无返回值。
c.一个类只有一个析构函数,若未显示定义,系统会自动生成一个缺省的析构函数。
d.对象生命周期结束时,系统会自动调用析构函数。
e.析构函数主要完成清理工作,比如释放内存等工作。
例子:

Array(int size)    {        _ptr=(int*)malloc(size*sizeof(int));    }    ~Array();//析构函数    {        if(_ptr)        {            free(_ptr);            _ptr=0;        }    }

4).赋值操作符重载。
赋值运算符重载是对一个已经存在的对象进行赋值拷贝。

bool operate==(const Date& d)    {        return _year==d._year            &&_month==d.month            &&_day==d._day;    }Date d1,d2;d1==d2;//d1.operate=(&d1,d2);

5).运算符重载
operate+合法的运算符构成函数名,例如:operate=
重载运算符后,不能改变运算符的优先级/结合性/操作数个数
注:5个c++不能重载的运算符:*/::/sizeof/?:/.

阅读全文
0 0
原创粉丝点击