如果一个类中什么成员都没有,则简称为空类,但空类中并非什么都没有,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数
一、构造函数(特殊的成员函数)
二、析构函数(特殊的成员函数)
三、拷贝构造函数(特殊的成员函数)
四、赋值运算符重载函数
五、取地址操作符重载
六、 const修饰的取地址操作符重载
C++把类型分为两类:内置类型(基本类型)和自定义类型。
内置类型:int / char / double / 指针 / 内置类型数组 等等。
自定义类型:struct / class定义的类型。
默认构造函数有三种:全缺省的构造函数、无参的构造函数、用户不写编译器自动生成的构造函数。(注意:必须传参的构造函数并不是默认构造函数)
1)对内置类型的成员变量不做初始化处理。
2)对自定义类型的成员变量会去调用它的默认构造函数初始化。
// 像这两种类,我们就需要自己实现构造函数(对应第1小点)
class Date
{
int _year;
int _month;
int _day;
};
class Stack
{
int* _pData;
int _top;
int _capacity;
};
// 像这种类,我们不需要自己实现构造函数,默认生成的就可以(对应第2小点)
class MyQueue
{
Stack _pushST;
Stack _popST;
};
1.主要任务:两个已经存在的同类对象之间进行赋值拷贝。(把一个对象赋值给另一个对象)
2.特征:
1)函数名是 operator=,参数类型是引用(常用const修饰)。
2)函数返回值是引用(因为在内置类型中是可以连续赋值的,比如:i = j = k,所以最好沿用这个习惯)。
3)返回 *this。
4)若未显式定义,编译器会自动生成一个默认的赋值运算符重载函数。
类名& operator=(const 类名& 对象)
{
// ...
}
Date& operator=(const Date& d)
{
if(this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
默认生成的赋值运算符重载函数:
1)对内置类型的成员变量,会完成按字节序的值拷贝(浅拷贝)。
2)对自定义类型的成员变量,会调用它的赋值运算符重载函数。
// 像这种类,默认生成的赋值重载函数完成浅拷贝就可以满足需求(对应第1小点)
class Date
{
int _year;
int _month;
int _day;
};
// 像这种类,因为默认生成的浅拷贝不能满足需求,所以需要我们自己实现深拷贝的赋值重载函数
class Stack
{
int* _pData;
int _top;
int _capacity;
};
// 像这种类,我们不需要自己实现赋值重载函数,默认生成的就可以(对应第2小点)
class MyQueue
{
Stack _pushST;
Stack _popST;
};
int main()
{
// 拷贝构造是用一个已经存在的对象去初始化一个马上创建实例化的对象
Date d4(d1); // 拷贝构造
Date d5 = d1; // 拷贝构造
// 赋值拷贝是两个已经存在的对象之间进行赋值拷贝
d2 = d1 = d3; // 赋值拷贝
d4 = d5; // 赋值拷贝
return 0;
}
1.主要任务:都是取出对象的 this指针,即对象的地址。
2.特征:
1)若未显式定义,编译器会自动生成。
// 取地址操作符重载
类名* operator&()
{
return this;
}
// const修饰的取地址操作符重载
const 类名* operator&()const
{
return this;
}
Date* operator&()
{
return this;
}
const Date* operator&()const
{
return this;
}