博客
关于我
初识C++3——类的六个默认成员函数
阅读量:639 次
发布时间:2019-03-14

本文共 2410 字,大约阅读时间需要 8 分钟。

C++ 空类的默认成员函数深入解析

在C++编程中,空类(即没有成员的类)看似什么都没有,但实际上系统会为我们自动生成六个默认成员函数。这些函数分别是构造函数、析构函数、拷贝构造函数、赋值操作符重载、取地址操作符重载以及const取地址操作符重载。了解这些默认函数的特点和用法,对于新手来说至关重要。

1. 构造函数

构造函数是用于初始化对象成员的重要函数。系统会自动生成默认构造函数,当类没有显示定义构造函数时。默认构造函数没有参数,可以被多次调用。需要注意的是,如果类中有显示定义的构造函数,且没有提供默认参数的构造函数,系统只会生成一个默认构造函数。

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;};

构造函数的特点:

  • 构造函数的名称与类名相同。
  • 无返回值。
  • 初始化对象成员的值。
  • 系统会自动调用,无需显式定义。

2. 析构函数

析构函数与构造函数相反,用于释放资源。析构函数自动由系统调用,对象销毁时执行。析构函数的名称前加~符号。

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()
  • 无返回值,无参数。
  • 系统会自动调用。
  • 用于释放资源。

3. 拷贝构造函数

拷贝构造函数用于对象复制时自动生成。拷贝构造函数的参数必须是引用类型,若使用传值传参会导致无穷递归。

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&)
  • 拷贝构造函数的参数必须是引用类型。
  • 系统默认生成拷贝构造函数。

4. 赋值运算符重载

赋值运算符重载用于定义=操作符的行为。若类没有显示定义赋值运算符,系统会自动生成默认拷贝构造函数。

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;};

赋值运算符重载的注意事项:

  • 操作符必须有一个操作数。
  • 参数必须是引用类型。
  • 检查是否为自身赋值。

5. 取地址操作符重载

取地址操作符重载用于定义&操作符的行为。通常不需要重载,默认生成的取地址操作符足够使用。

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/

你可能感兴趣的文章
OSG——选取和拖拽
查看>>
OSG中找到特定节点的方法(转)
查看>>
OSG学习:C#调用非托管C++方法——C++/CLI
查看>>
OSG学习:OSG组成(三)——组成模块(续):OSG核心库中的一些类和方法
查看>>
OSG学习:OSG组成(二)——渲染状态和纹理映射
查看>>
OSG学习:WIN10系统下OSG+VS2017编译及运行
查看>>
OSG学习:人机交互——普通键盘事件:着火的飞机
查看>>
OSG学习:几何体的操作(一)——交互事件、简化几何体
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(一)——四边形
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>
OSG学习:空间变换节点和开关节点示例
查看>>