C++默认成员函数

                                                            类和对象

隐含的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值