C++默认成员函数

来源:互联网 发布:链接买卖淘宝 编辑:程序博客网 时间:2024/05/20 21:20
                                                            类和对象

隐含的this指针
1. 每个成员函数都有一个指针形参,即this指针。(构造函数没有隐含的this指针形参)。
2. 编译器会对成员函数进行处理。对象调用时,对象地址作实参传递给成员函数的第一个形参 this 指针。
3. this 指针是成员函数 隐含的指针形参编译器处理的,我们不能随意添加,也不能在调用时显示的传递对象的地址 给this指针。

构造函数
对私有的成员变量进行初始化。构造函数仅在定义对象的时候自动执行一次。
构造函数是特殊的成员函数;
特点:
函数名与类名同名;
无返回值;
对象构造时,即对象实例化,系统自动调用构造函数;
构造函数可以重载;
可以在类内外定义;
如果类中没有给出构造函数,编译器会自动给出一个缺省的构造函数;
无参构造函数 全缺省值的构造函数 都是全省构造函数,只能有一个。

拷贝构造函数
创建对象时使用同类对象来进行初始化,即 同类对象的引用;
特点:
构造函数的重载;
必须使用引用传参,传值会引起无穷递归调用 。(如果不是传引用,则就相当于传值方式,而传值则会调用该类的拷贝构造函数,从而无穷递归的调用拷贝构造函数。* 传指针也是传值的方式。)
如果没有显示定义,系统会默认缺省的拷贝构造函数,缺省的会一次拷贝类成员来初始化。
ps:创建对象的同时初始化 是拷贝构造函数。
为什么可以直接访问私有的成员变量?
1.在类的成员函数中可以直接访问同类对象的私有、保护成员;
2.C++的访问限定符是以类为单位的,即 在这个单位内的成员是可以互相访问的。
析构函数
一个对象的生命周期结束,系统会自动调用析构函数。
析构函数是特殊的成员函数。
特点:
类名前 加~
无返回值
一个类只有一个析构函数,如果没有,系统会自动生成缺省的析构函数。
析构函数不是删除对象 而是做些清理工作。
运算符重载
增强程序的可读性,C++支持运算符的重载。
特点:
operator+ 合法的运算符构成函数名(重载< operator<)
重载以后,不能改变运算符的优先级、结合性、操作数个数。

5个不能重载的运算符:
. 类成员访问运算符
.* 类成员指针访问运算符
:: 作用域
sizeof 长度运算符
?: 三目运算符 条件运算符。
赋值运算符的重载
赋值运算符是对一个已存在的对象进行拷贝赋值。
拷贝构造函数是创建对象的同时用已有的对象初始化它。

#include<iostream>using namespace std;class Date{public:    Date()//默认构造函数    {}    Date(int year, int month, int day)              //构造函数        :_year(year)        ,_month(month)        ,_day(day)    {        cout << "构造" << endl;    }    ~Date()    {}    Date(const Date& d)                         //拷贝构造    {        _year = d._year;        _month = d._month;        _day = d._day;        cout << "copy"<<endl;    }    Date& operator=(const Date& d)          //赋值运算符的重载    {        if (this != &d)        {            _year = d._year;            _month = d._month;            _day = d._day;        }        cout << "==" << endl;        return *this;    }    void print()    {        cout << _year << " " << _month << " " << _day << endl;    }private:    int _year;    int _month;    int _day;};int main(){    Date d1(2015,6,4);    Date d2 = d1;    Date d3;    d3 = d1;    d1.print();    d2.print();    d3.print();    getchar();    return 0;}

哪些成员变量必须放在初始化列表里面?
1.常量成员变量(常量 创建时必须初始化)
2.引用类成员变量(引用创建时必须初始化)
3.没有缺省构造函数的类成员变量。
成员变量按声明顺序依次初始化,而不是初始化列表出现的顺序。

0 0