博客
关于我
初识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/

你可能感兴趣的文章
NFS网络文件系统
查看>>
nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
查看>>
ng 指令的自定义、使用
查看>>
Nginx
查看>>
nginx + etcd 动态负载均衡实践(二)—— 组件安装
查看>>
nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
查看>>
Nginx + Spring Boot 实现负载均衡
查看>>
Nginx + uWSGI + Flask + Vhost
查看>>
Nginx - Header详解
查看>>
Nginx Location配置总结
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 常用配置清单
查看>>