编辑
一、前言
二、拷贝构造函数
⭕拷贝构造函数概念
⭕拷贝构造函数的特点
⭕拷贝构造函数的几种类型
三、赋值运算符重载
⭕运算符重载概念
⭕赋值运算符重载
⭕前置++和后置++重载
四、const成员函数
⭕const成员函数概念
⭕常量成员函数需要满足的特点
⭕常量成员函数有利条件
⭕const常量的几个常见问题
五、取地址(&)及(const &)操作符重载
六、总结
一、前言
这里有上篇链接)前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数。也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点——类和对象(拷贝构造函数、赋值运算符重载、const成员、取地址及const取地址操作符重载)。下面话不多说坐稳扶好咱们要开车了。
编辑
二、拷贝构造函数
⭕拷贝构造函数概念
拷贝构造函数是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始化新对象,实现对象的复制操作。通过定义拷贝构造函数,我们可以控制对象的拷贝过程,并确保正确处理含有指针或动态分配内存的类。
拷贝构造函数的定义形式如下:
类名(const 类名& 对象名)
{
// 构造函数的主体部分
// 将对象的属性值拷贝到新对象
}
⭕拷贝构造函数的特点
拷贝构造函数在C++中具有自动调用、形参类型为const引用、逐一复制对象成员、隐式调用与显式调用、需要自定义情况等特点下面我会按顺序逐一分析:
1. 自动调用:拷贝构造函数会在特定场景下自动调用,例如对象的初始化、对象作为参数传递给函数、函数返回对象等情况。无需显式调用,编译器会根据需要自动选择合适的拷贝构造函数进行调用。
2. 形参类型为const引用:拷贝构造函数的参数类型通常是一个常引用(const引用),即“ const类名& 对象名 ”。这是为了避免修改原对象的属性值,保证在拷贝过程中原对象不会被修改。
3. 对象的成员逐一复制:拷贝构造函数会将原对象的属性值通过复制或拷贝的方式赋值给新对象的相应属性。对于基本数据类型的成员变量,会直接进行值的复制;对于对象类型的成员变量,会调用该对象的拷贝构造函数进行复制。
4. 隐式调用与显式调用:在大多数情况下,拷贝构造函数会由编译器隐式调用,无需手动编写代码。然而,在某些特殊情况下,需要显式地调用拷贝构造函数,例如通过拷贝构造函数初始化新对象、创建对象数组、创建对象的副本等。
5. 需要自定义情况:当类中存在指针成员、动态分配的内存或资源时,通常需要自己定义拷贝构造函数。这是因为默认的拷贝构造函数只进行浅拷贝,即简单地复制指针成员的值,而不会复制指针所指向的内存。因此,需要手动编写拷贝构造函数来进行深拷贝,确保新对象和原对象具有独立的内存空间。
6. 只针对同类对象:拷贝构造函数只能用于同类对象之间的拷贝,无法用于不同类之间的对象拷贝。如果需要实现类之间的对象拷贝,可以使用转换构造函数或赋值运算符重载等方式。
掌握拷贝构造函数的特点有助于正确地实现对象的复制操作,并解决潜在的问题。
⭕拷贝构造函数的几种类型
C++中常见的拷贝构造函数的几种类型包括:默认拷贝构造函数、自定义浅拷贝拷贝构造函数以及自定义深拷贝拷贝构造函数。
1. 默认拷贝构造函数:如果没有显式定义拷贝构造函数,编译器会自动生成默认的拷贝构造函数。默认拷贝构造函数执行的是逐一复制成员的操作,即将原对象的每个成员属性的值赋值给新对象的对应成员属性。然而,如果类中存在指针成员、动态分配的内存或资源,该默认拷贝构造函数通常不能满足需求,可能会导致浅拷贝问题。
2. 自定义浅拷贝拷贝构造函数:自定义浅拷贝拷贝构造函数会简单地复制原对象的成员属性的值给新对象的对应成员属性。这种拷贝构造函数适用于对象中没有指针、动态分配的内存或资源的情况,因为它不会进行深拷贝。(更多的介绍在这里)
3. 自定义深拷贝拷贝构造函数:在类中存在指针成员、动态分配的内存或资源时,需要自定义拷贝构造函数来进行深拷贝。自定义深拷贝拷贝构造函数会为新对象的指针成员分配独立的内存,并将原对象的指针指向的内容复制到新对象中,确保对象的独立性和数据完整性。(更多的介绍在这里)
下面这段代码,展示了一个具有指针成员的类的自定义深拷贝拷贝构造函数:
class MyClass {
private:
int* data;
public:
// 自定义深拷贝拷贝构造函数
MyClass(const MyClass& other) {
data = new int;
*data = *(other.data);
}
// ...
};
在上面的代码中,自定义的拷贝构造函数通过new操作符为新对象的指针成员分配独立的内存,并将原对象的指针指向的值复制到了新对象中,实现了深拷贝。
需要根据类的具体情况来选择是否需要自定义拷贝构造函数,并根据类中是否存在指针、动态分配的内存或资源来决定是否需要进行深拷贝。
总的来说,根据类中成员的特点和需求,选择合适的拷贝构造函数类型,确保对象的复制操作正确、高效地执行。拷贝构造函数在C++中有诸多优点,它们使得对象的复制、传递和返回更加方便和安全。通过合理定义和使用拷贝构造函数,可以提高代码的可维护性和可读性,避免资源冲突和问题的发生,并使得程序的设计更加灵活和优雅。
三、赋值运算符重载
⭕运算符重载概念
在C++中,运算符重载(Operator Overloading)是一种特性,允许程序员重新定义或重新定义运算符的操作行为。运算符重载允许我们使用相同的运算符来执行不同类型的操作,使得代码更加简洁、直观和易于理解。
通过运算符重载,我们可以为用户自定义的类、枚举类型以及内置的数据类型(如整数、浮点数等)定义运算符的行为。这就意味着我们可以使用常规运算符(如"+", "-", "*", "/"等)来操作自定义类型的对象,以及在自定义类型之间实现特定的运算。
标签:const,入门,函数,C++,运算符,重载,拷贝,构造函数 From: https://blog.51cto.com/u_16531685/9368951