类里面的成员函数什么都不写的时候,编译器会自动生成6个成员函数。
1.构造函数:
顶替原来SetDate函数。因为可能存在忘记调用初始化函数而直接进行使用。为了解决,C++引入了构造函数完成初始化。对象实例化的时候自动调用。(保证对象一定可以初始化)
构造函数可以重载。(可以有多个构造函数)
构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主
要任务并不是开空间创建对象,而是初始化对象。
其特征如下: 函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。
class Date
{
public:
// 构造函数 自动调用 没有返回值 一定会初始化
Date(int year, int month, int day) //有参的 和 缺省的 不构成重载 不能共存
{
_year = year;
_month = month;
_day = day;
}
Data() // 无参的 和 缺省的 会产生歧义 不能共存
{
_year = 1;
_month = 1;
_day = 1;
}
Date(int year = 1, int month = 1, int day = 1) //缺省的 最棒的
{
_year = year;
_month = month;
_day = day;
}
private:
int _year; // 对内置类型不初始化
int _month;
int _day;
};
class Bata
{
public:
void Print()
{};
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 9, 29); // 调用有参数的构造函数 这个就可以直接自动调用构造函数初始化。
Date d2; // 调用无参的构造函数
Bata b1;// 默认生成的构造函数是随机值
return 0;
}
析构函数:
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
析构函数是特殊的成员函数。
其特征如下:析构函数名是在类名前加上字符 ~。无参数无返回值(不能重载)。 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。 对象生命周期结束时,C++编译系统系统自动调用析构函数。
出了main的作用域后会调用析构函数。
s2先析构,s1和s2在栈存放,s2后进先出。
class SeqList
{
public:
SeqList(int capacity = 10)
{
_pData = (DataType*)malloc(capacity * sizeof(DataType));
assert(_pData);
_size = 0;
_capacity = capacity;
}
~SeqList()
{
free(_pData ); // 释放堆上的空间
_pData = nullptr; // 将指针置为空
_capacity = 0;
_size = 0;
}
private:
int* _pData ;
int _size;
int _capacity;
};
int main()
{
SeqList s1;
//地下调用不用自己再写 SeqList的init和destory 因为构造和析构就默认调用解决了 不用自己再调用了
//...
SeqList s2; // s1和s2是s2先析构
return 0;
}
运算符重载:
自定义类型不支持运算符,C++可以用运算符重载来让类对象支持用某个运算符。
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
// bool operator==(Date* this, const Date& d2)
// 这里需要注意的是,左操作数是this指向的调用函数的对象
bool operator==(const Date& d2)
{
return _year == d2._year
&& _month == d2._month
&& _day == d2._day;
}
private:
int _year;
int _month;
int _day;
};
void Test ()
{
Date d1(2018, 9, 26);
Date d2(2018, 9, 27);
d1 == d2; // 其实是这个 d1.operator==(&d1, d2);
cout<<(d1 == d2)<<endl;
}
class Array
{
public:
Array()
{
for(int i = 0; i<10; ++i)
{
_a[i] = i;
}
}
int& operator[](int pos) // 对象是在main定义的,这里可以用引用,出了类作用域值还在
{
return _a[pos];
}
private:
int _a[10];
};
int main()
{
Array ar;
cout << ar[3] << endl; // 打印3
ar[3] = 30; // 可以完成修改
}