本文共 2410 字,大约阅读时间需要 8 分钟。
在C++编程中,空类(即没有成员的类)看似什么都没有,但实际上系统会为我们自动生成六个默认成员函数。这些函数分别是构造函数、析构函数、拷贝构造函数、赋值操作符重载、取地址操作符重载以及const取地址操作符重载。了解这些默认函数的特点和用法,对于新手来说至关重要。
构造函数是用于初始化对象成员的重要函数。系统会自动生成默认构造函数,当类没有显示定义构造函数时。默认构造函数没有参数,可以被多次调用。需要注意的是,如果类中有显示定义的构造函数,且没有提供默认参数的构造函数,系统只会生成一个默认构造函数。
class Date {public: Date() { _year = 1900; _month = 1; _day = 1; } Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;}; 构造函数的特点:
析构函数与构造函数相反,用于释放资源。析构函数自动由系统调用,对象销毁时执行。析构函数的名称前加~符号。
class SeqList {public: SeqList(int capacity = 10) { _pData = (DataType*)malloc(capacity * sizeof(DataType)); assert(_pData); _size = 0; _capacity = capacity; } ~SeqList() { if (_pData) { free(_pData); _pData = nullptr; _capacity = 0; _size = 0; } }private: int* _pData; size_t _size; size_t _capacity;}; 析构函数的特点:
~ClassName()。拷贝构造函数用于对象复制时自动生成。拷贝构造函数的参数必须是引用类型,若使用传值传参会导致无穷递归。
class String {public: String(const char* str = "") { _str = (char*)malloc(strlen(str) + 1); strcpy(_str, str); cout << "String()" << endl; } String(const String& s) { _str = (char*)malloc(strlen(s._str) + 1); cout << "拷贝构造" << endl; strcpy(_str, s._str); }private: char* _str;}; 拷贝构造函数的特点:
ClassName(const ClassName&)。赋值运算符重载用于定义=操作符的行为。若类没有显示定义赋值运算符,系统会自动生成默认拷贝构造函数。
class Date {public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } Date& operator=(const Date& d) { if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; }private: int _year; int _month; int _day;}; 赋值运算符重载的注意事项:
取地址操作符重载用于定义&操作符的行为。通常不需要重载,默认生成的取地址操作符足够使用。
class Date {public: Date* operator&() { return this; } const Date* operator&() const { return this; }private: int _year; int _month; int _day;}; 了解默认成员函数的作用和用法,可以帮助我们更高效地开发C++程序。合理使用默认构造函数和析构函数,避免不必要的代码冗余。同时,通过定义拷贝构造函数和赋值运算符重载,可以更好地控制对象的行为和资源的释放。
转载地址:http://esulz.baihongyu.com/