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

你可能感兴趣的文章
Nginx访问控制_登陆权限的控制(http_auth_basic_module)
查看>>
nginx负载均衡和反相代理的配置
查看>>
nginx负载均衡器处理session共享的几种方法(转)
查看>>
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>
nginx转发端口时与导致websocket不生效
查看>>
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置Https证书
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
nginx配置全解
查看>>
Nginx配置参数中文说明
查看>>
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>