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

你可能感兴趣的文章
php判断数组是否为空
查看>>
PHP判断数组是否有重复值、获取重复值
查看>>
springboot基于Web的社区留守儿童管理系统源码毕设+论文
查看>>
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
查看>>
PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示
查看>>
PHP加密与安全的最佳实践
查看>>
PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
查看>>
php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
查看>>
PHP去掉转义符
查看>>
php去除字符串开头或末尾的字符(例如逗号)
查看>>
php反射api
查看>>
PHP反射ReflectionClass、ReflectionMethod 入门教程
查看>>
PHP反射机制
查看>>
php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
查看>>
php取绝对值
查看>>
PHP变量内容的获取
查看>>
php各种常用的算法
查看>>
php各种缓存策略对比
查看>>
RabbitMQ高级特性 - 消息分发(限流、负载均衡)
查看>>
php后台“爬虫”模拟登录第三方系统
查看>>