行业知识
【C++初阶】—— 类和对象 (中)
2026-11-01 09:20:31
来源:互联网转载
个人主页:EterNity_TiMe_
⏩收录专栏⏪:C++ “ 登神长阶 ”
期待您的关注
类和对象
- 1. 构造函数
- 构造函数的概念
- 构造函数的特征
- 默认构造函数
- 2. 析构函数
- 析构函数的概念
- 析构函数的特征
- 默认析构函数
- 3. 拷贝构造函数
- 拷贝构造函数的概念
- 拷贝构造函数的特征
- 默认拷贝构造函数
- 四. 总结
前言:在参透了类的相关知识后,我们来进一步了解类的6个默认成员函数,本篇先让我们了解三个,剩下的将会在下一篇展开
如果你还没弄清类的基础知识建议先阅读这篇文章
类的基础知识
默认成员函数: 用户没有显式实现,编译器会生成的成员函数称为默认成员函数
1. 构造函数
构造函数的概念
构造函数: 是一个特殊的成员函数,名字与类名相同,创建相同类型对象时由编译器自动调用,用来初始化对象
构造函数可以重载
例如:
class Date{public:// 无返回值,名字与类名相同,用来初始化对象// 带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 无参构造函数 Date() {}private:int _year;int _month;int _day;};int main(){Date d1; // 调用无参构造函数Date d2(2024,5,22); // 调用带参构造函数}注意: 如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
构造函数的特征
注意:
- 构造函数是特殊的成员函数,与一般的函数不同
- 构造函数的主要任务不是开空间创建对象,而是初始化对象。
如果类中没有显式定义构造函数,系统就会自动生成一个默认构造函数
class Date{public:// 当我们没有写构造函数时,系统会直接生成默认构造//Date(int year, int month, int day)//{//_year = year;//_month = month;//_day = day;//}// 但如果我们显式定义了构造函数,编译器将不再生成private:int _year;int _month;int _day;};int main(){Date d1; }- 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数
- 将Date类中构造函数放开,代码编译失败,因为一旦我们自己定义任何构造函数,编译器将不再生成
C++11 中针对内置类型成员不初始化的缺陷做出了改变,内置类型成员变量在类中声明时可以给默认值。
class Date{public:void Print() { cout Date d1; d1.Print(); //打印出日期:2024,5,22}public:pxt(){cout private:// 内置类型int _year;int _month;int _day;// 自定义类型pxt _t;};int main(){Date d;return 0;}public: //当实例化对象时没有传参,系统不知道是调用全缺省函数还是无参的函数 Date() { _year = 2024; _month = 5; _day = 22; } Date(int year = 2024, int month = 5, int day = 22) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;};public:// 构造函数Date(){cout cout Date d1; }public:Stack(size_t capacity = 3) // 构造函数{_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc false");return;}_capacity = capacity;_size = 0;}//必须要我们手动写析构函数来释放~Stack() // 析构函数{if (_array){free(_array);_array = NULL;_capacity = 0;_size = 0;}}private:DataType* _array;int _capacity;int _size;};int main(){Stack s;return 0;}public:~pxt(){cout private:// 内置类型int _year;int _month;int _day;// 自定义类型pxt _t;};int main(){Date d;return 0;}public:Date(int year = 2024, int month = 2, int day = 22){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 20);Date d2(d1); //用d1初始化d2return 0;}public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc false");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr; _capacity = 0;_size = 0;}}private:DataType* _array;size_t _size;size_t _capacity;};int main(){Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);// 我们没有给出拷贝构造,将调用默认拷贝构造Stack s2(s1);return 0;}