博客
关于我
C++-必须知道的类的6个默认成员函数(构造-析构-拷贝构造-操作符重载)
阅读量:275 次
发布时间:2019-03-01

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

C++类成员函数经典讲解

在C++编程中,类的成员函数是实现类对象行为的核心机制。本文将详细介绍C++类中的六大默认成员函数及其相关概念,帮助开发者深入理解类的行为管理。

1. 类的六大默认成员函数

在C++中,每个类都会为其成员提供六个默认的成员函数:

  • copy constructor(拷贝构造函数)
  • default constructor(默认构造函数)
  • destructor(析构函数)
  • assignment operator(赋值运算符)
  • operator++(前置++运算符)
  • operator--(后置--运算符)

这些函数为类提供了基本的内置行为支持,极大简化了类的开发流程。

2. 构造函数(Constructor)

2.1 构造函数的作用

构造函数用于初始化类对象。当一个类实例被创建时,编译器会自动调用对应的构造函数,完成对象的初始化过程。

2.2 构造函数的特点

  • 名称与类名一致:函数名通常与类名相同。
  • 由编译器自动调用:类实例化时,编译器会根据类名调用对应的构造函数。
  • 只调用一次:在对象生命周期内,构造函数只执行一次。
  • 无返回值:构造函数通常没有返回值。
  • 默认构造函数:如果类中未定义构造函数,编译器会生成一个默认的无参构造函数。

2.3 构造函数的典型实现

class Date {public:    Date(int year = 1900, int month = 1, int day = 1) {        _year = year;        _month = month;        _day = day;    }    // 其他成员函数private:    int _year, _month, _day;};

在这个示例中,Date类定义了一个带参数的构造函数,用于初始化对象的成员变量。

3. 析构函数(Destructor)

3.1 析构函数的作用

析构函数用于管理类对象的销毁过程,释放类分配的内存资源,确保类的状态得到妥善处理。

3.2 析构函数的特点

  • 名称格式:析构函数的名称前加上~符号,例如~Date()
  • 无参数:析构函数通常没有参数。
  • 自动调用:在对象生命周期结束时,编译器会自动调用析构函数。
  • 默认生成:如果类中未定义析构函数,编译器会默认生成一个。

3.3 析构函数的实现

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 = NULL;            _capacity = 0;            _size = 0;        }    }private:    int* _pData;    size_t _size;    size_t _capacity;};

在这个示例中,SeqList类的析构函数负责释放内存资源,确保对象销毁时状态得到正确处理。

4. 拷贝构造函数(Copy Constructor)

4.1 拷贝构造函数的概念

拷贝构造函数是一个特殊的构造函数,它接受一个类的引用作为参数,用于将一个对象的内容拷贝到另一个对象中。在std::string类中,拷贝构造函数通过&符号表明其参数是引用。

4.2 拷贝构造函数的特点

  • 单一引用参数:拷贝构造函数的参数通常是一个类的引用。
  • 隐式传递:类成员函数默认接受this指针,确保函数执行在类对象上下文中。
  • 默认生成:如果类中未定义拷贝构造函数,编译器会生成一个默认的拷贝构造函数。

4.3 拷贝构造函数的实现

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;    }private:    int _year, _month, _day;};

在这个例子中,Date类的拷贝构造函数允许通过引用参数创建新的Date对象,实现深拷贝或浅拷贝,具体取决于实现方式。

5. 赋值运算符重载(Assignment Operator)

5.1 运算符重载的概念

运算符重载是指为用户定义的类重定义内置运算符的行为,使其能够支持自定义类的操作。赋值运算符是最常见的运算符之一。

5.2 赋值运算符重载的特点

  • 参数类型:通常接受一个左值或右值的类实例。
  • 返回值:通常返回一个引用,允许链式调用。
  • 自我赋值检测:通常会检查操作数是否是this指针,避免无意义的自我赋值操作。
  • 返回*this:赋值运算符重载函数通常返回*this,允许方法链。

5.3 赋值运算符重载的示例

class String {public:    String(const char* str = "jack") {        _str = (char*)malloc(strlen(str) + 1);        strcpy(_str, str);    }    ~String() {        cout << "~String()" << endl;        free(_str);    }private:    char* _str;};class Person {private:    String _name;    int _age;};

在这个示例中,String类定义了一个拷贝构造函数,用于实现字符串对象的深拷贝。

6. const成员函数(Const Member Functions)

6.1 const成员函数的概念

const修饰的成员函数是指在这些函数中,this指针是const类型,表明该函数不能修改类的成员变量或其他状态。

6.2 const成员函数的特点

  • 函数参数const修饰只影响this指针,不影响其他参数类型。
  • 操作限制const函数不能修改对象的内存状态,确保函数行为一致性。
  • 默认行为:如果类中未定义const函数,编译器会默认生成一个const函数。

6.3 const成员函数的实现

class Person {public:    void SetAge(int age) const {        _age = age;    }private:    int _age;};

在这个示例中,SetAge函数被const修饰,确保其不能修改对象的成员变量。

总结

通过以上对构造函数、析构函数、拷贝构造函数、赋值运算符重载和const成员函数的讲解,可以全面理解C++类成员函数的核心机制。掌握这些概念和技巧,是成为一名熟练C++程序员的关键基础。

转载地址:http://unno.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim教程【十二】
查看>>
Nim游戏
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>
nio 中channel和buffer的基本使用
查看>>
NIO三大组件基础知识
查看>>
NIO与零拷贝和AIO
查看>>
NIO同步网络编程
查看>>
NIO基于UDP协议的网络编程
查看>>
NIO笔记---上
查看>>
NIO蔚来 面试——IP地址你了解多少?
查看>>
NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
查看>>