类和对象2-默认成员函数(构造析构)

来源:互联网 发布:最好玩的网络手机游戏 编辑:程序博客网 时间:2024/06/10 14:00

类有六个成员函数:1.构造函数

                                 2.拷贝构造

                                 3.析构函数

                                 4.赋值操作符重载

                                 5.取地址操作符重载

                                 6.const修饰的取地址操作符重载

一.构造函数

类的成员变量是私有的,要对它们进行初始化,必须用一个公有的成员函数来进行,同时这个函数应该仅在定义对象是调用一次,该函数就是构造函数

1.特点:1.函数名与类名相同;

           2.无返回值

           3.可以重载

           4.有初始化列表

class Date{public:Date(int year, int month, int day)//构造函数,没有返回值类型{_year = year;_month = month;_day = day;cout << "Date(int year, int month, int day)" << endl;}Date()                  //无参构造函数{cout << "Date()" << endl;}private:int _year;int _month;int _day;};


           5.若没有定义,编译器会自动提供

           6.无参的构造函数和带缺省值的构造函数都称为缺省构造函数(缺省构造函数只能有一个)

Date()                  //无参构造函数{cout << "Date()" << endl;}Date(int year = 2017,int month = 10,int day = 20)        //带缺省的构造函数{_year = year;                                        //无参构造函数和带缺省的构造函数都叫缺省构造函数,且只能有一个_month = month;_day = day;}
             7.创建对象时调用,且只能调用一次


2.构造函数的作用

a.构造对象

b.初始化对象

c.类型转换——构造函数为单参时(若不想类型转换,用explicit关键字)


3.构造函数的初始化列表

a.以冒号(:)开头

b.用逗号隔开每一个变量(,)

c.用圆括号()进行初始化

class Date{public:Date(int year=2017, int month=10, int day=20):_year(year)//初始化列表并不能指定数据成员的初始化顺序,初始化顺序由 变量在类中的定义顺序决定, _month(month)                         //对象还没有创造成功, _day(day){                                           //对象创建成功}private:int _year;int _month;int _day;};

注:

      1)每个成员变量只能在初始化列表中出现一次

      2)初始化列表仅用于初始化成员变量

      3)初始化列表并不能指定成员的初始化顺序,数据的初始化顺序由变量在类中的定义决定

      4)尽量避免用成员初始化成员,成员的初始化顺序最好与定义保持一致

4.必须在构造函数的初始化列表中初始化的变量

   a.const修饰的变量

   b.引用

   c.没有缺省构造函数的类类型成员


若没有定义构造函数,系统虎皮默认合成一个构造函数。系统提供的默认构造函数,只对定义在全局作用域中的对象进行初始化(内置类型和复合类型的成员)



二.拷贝构造函数

创建对象时,使用同类型的对象来进行初始化,这时用到的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数

1.特点:

a.拷贝构造函数其实是构造函数的重载

b.没有返回值

c.拷贝构造函数的参数只有一个且必须使用引用传参,否则会引发无穷递归


d.若为显示定义,系统会默认缺省的拷贝构造函数

例:

class Date{public:Date(int year = 2017, int month = 10, int day = 20):_year(year), _month(month), _day(day){cout << "Date() " << this << endl;}Date(const Date& d)//拷贝构造,构造函数的重载,必须为单参               //必须为引用:_year(d._year), _month(d._month), _day(d._day){cout << "Date(const Date& d)  "<<this << endl;}private:int _year;int _month;int _day;};


三.析构函数

当一个对象生命周期结束时,c++编译系统会自动调用一个成员函数,做一些清理工作,这个特殊的函数就是析构函数

1.特点:

       a. 析构函数的函数名: ~类名

       b.无返回值

       c.无参数列表,不能重载,所以一个类只有一个析构函数

       d.在对象生命周期结束时,c++系统会自动调用

       e.析构函数并不是删除对象,而是做一些清理工作

class Date{public:Date(int year = 2017, int month = 10, int day = 20):_year(year), _month(month), _day(day){cout << "Date() " << this << endl;}~Date()//析构函数只有一个,且不能重载(因为没有参数列表){cout << "~Date()" << endl;}private:int _year;int _month;int _day;};



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