C++ 学习笔记(四)—— 类和对象

发布于:2025-03-24 ⋅ 阅读:(34) ⋅ 点赞:(0)
1、this指针
class Date
{
public:
    void Init(Date* this, int year, int month, int day)
    {
        this->_year = year;
        this->_month = month;
        this->_day = day;
        this->Print();
        //  这就是this指针,是编译器自己加的,是用来让成员函数找到成员变量的位置的;
        //  this在实参和形参位置不能显示写,但在类里面可以显示的用;
        cout << this << endl;
    }

    void Print()
    {
        cout << _year << endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

小扩展:

1)this指针存在哪?(栈、堆、静态区、常亮区)

答:this是一个形参,一般是存在栈里面;有些编译器(如VS)会优化,直接用寄存器加载;

2、类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类;

空类中真的什么都没有吗?其实并不是,任何类在什么都不写时,编译器也会自动生成6个默认成员函数;

默认成员函数的定义也就是用户没有显式实现,编译器会自动生成的成员函数;

六个默认成员函数:

  1. 初始化和清理:构造函数主要完成初始化的工作;析构函数主要完成清理工作;
  2. 拷贝复制:拷贝构造是使用同类对象初始化创建对象;赋值重载主要是把一个对象赋值给另一个对象;
  3. 取地址重载:主要是普通对象和const对象取地址,这两个很少会自己实现;

构造函数:

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

特征:1)函数名与类名相同;2)无返回值(void也不需要写);3)对象实例化时编译器自动调用对应的构造函数;4)构造函数可以重载(写多个构造函数,提供多个初始化方式);

class Date
{
public:
    Date()
    {
        _year = 1;
        _month = 1;
        _day = 1;
    }

    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    //  将上述两个构造函数合并为一个全缺省构造函数,更为灵活;
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        cout << _year << "/" << _month << "/" << _day << endl;
    }

private:
    int _year;
    int _month;
    int _day;
}

int main()
{
    Date dd;  //  此处注意不能写成“Date dd()”,会识别成一个函数声明的;
    dd.Print();  //  咱们这里会发现dd已经被初始化为“1/1/1”了,如果没有构造函数,这里出来的会是随机值;
    Date dd2(2023, 01, 01);
    dd2.Print();  //  此处输出“2023/01/01”;
    return 0;
}