文章目录
如果我们写了一个空类,那么真的这空类什么都没有吗?
答案并不是
对于任何一个类对象,都有6个默认成员函数
1.构造函数
我们每次写一个类的时候,都很有可能会忘记初始化,所以c++就有默认的构造函数,构造函数就是解决初始化的问题
1.构造函数(特殊的成员函数)
2.他的任务不是开辟空间,而是初始化对象
特征
1.函数名与类名相同
2.没有返回值
3.在对象实例化的时候自动调用
4.构造函数可以重载
5.如果没有显示定义构造函数,编译器会自动生成一个无参的默认函数,一旦用户显示定义编译器将不在生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| class Date { public:
Date(int year=0, int month=1, int day=2) { year_ = year; month_ = month; day_ = day; }
private:
int year_; int day_; int month_; A _aa; };
int main() { Date d;
Date d2(2022, 1, 15); Date d3(2022); Date d4 (2022, 3);
return 0; }
|
全局变量是最先开辟的,局部范围内无论是静态成员与否都是按顺序开辟的
2.析构函数
析构函数
不是完成对象的销毁,而是完成对象中资源清理(malloc的free)
特性
1.析构函数的函数名是在这类名前加个~ 如~Date
2.没有参数没有返回值
3.一个类有且只有一个析构函数
4.对象生命周期结束时,c++系统编译会自动调用析构函数
默认生成构造函数和析构函数会对自定义类型成员变量调用他的构造和析构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Date { public: Date(int year = 1, int month = 1, int day = 2) { _year = year; _month = month; _day = day; } ~Date() { cout << "~Date()" << endl; } private: int _year; int _month; int _day; };
int main() { Date d;
Date d2(2022, 1, 15); Date d3(2022); Date d4 (2022, 3);
Stack s1; Stack s2(4);
return 0; }
|
局部范围内非静态变量是按顺序从后往前西沟的 ,然后再到静态成员,最后到全局变量
拷贝构造函数
拷贝构造函数,是构造函数的重载
概念:是一个特殊的成员函数
函数名和类名相同
如果没有显示构造,系统会生成默认的构造函数
对于内置类型成员会按字节序的拷贝,memcpy,每个字节一次拷贝
总结,拷贝构造是我们不写也会生成的默认拷贝构造函数
传值传参和传值返回都会调用拷贝构造
如f(x),会调用一次
return x,也会调用一次拷贝构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int main() { Date d1(2022, 11, 9);
Date d2(d1); Stack st1(10); Stack st2(st1);
return 0; }
|
运算符的重载
operator
函数名加运算符
返回值是看这个操作符运算后返回的值是什么
参数,有几个操作符,就有操作数,就有几个参数
1.不能通过连接其他的符号来创建新的操作符,比如operator@
2.重载运算符必须有一个类类型参数(必须是自定义类型)
3.我们不能改变他的含义(>不能弄成<)
4.(::) (sizeof) (?) (.) (.*)这些不能重载,经常在笔试题里面出现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
bool operator>(const Date& d2) { if (_year > d2._year) { return true; } else if (_month > d2._month) { return true; } else if (_year == d2._year && _month == d2._month && _day > d2._day) { return true; } else { return false; } }
|
赋值运算符的重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Date& operator=(const Date& d) { if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; }
|