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

本文共 3172 字,大约阅读时间需要 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/

你可能感兴趣的文章
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty心跳检测机制
查看>>
Netty核心模块组件
查看>>
Netty框架内的宝藏:ByteBuf
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—3.Reactor线程模型三
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—5.Pipeline和Handler二
查看>>
Netty源码—6.ByteBuf原理一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理一
查看>>