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

你可能感兴趣的文章
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
查看>>
NR,NF,FNR
查看>>
nrf开发笔记一开发软件
查看>>
NSDateFormatter的替代方法
查看>>
NSSet集合 无序的 不能重复的
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
nullnullHuge Pages
查看>>
numpy 用法
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
查看>>
OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
查看>>
OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
查看>>
OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
查看>>
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>
OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
查看>>