C++超详细讲解拷贝构造函数
什么是拷贝构造函数
C++中的拷贝构造函数是一种特殊的构造函数,用于关于同类对象进行复制初始化。当使用一个对象去初始化另一个同类对象时,就会调用拷贝构造函数。拷贝构造函数通常使用一个类的引用作为其参数,并且不允许传入除该引用以外的任何值。
拷贝构造函数的使用场景
- 传递类对象给函数时,会调用拷贝构造函数;
- 返回类对象时,会调用拷贝构造函数;
- 在类中对当前类对象生成一个副本时,会调用拷贝构造函数。
拷贝构造函数示例1:深拷贝
在以下示例中,我们定义了一个学生类,并定义了两个对象stu1和stu2。在stu1作为参数传递给函数print()时,会调用一次拷贝构造函数。由于没有定义自己的拷贝构造函数,所以系统自动提供了一个默认的拷贝构造函数——进行逐个赋值;在函数print()中,我们输出了相应的学生信息。在运行过程中,我们可以看到两个对象的信息都被成功地输出。
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student(string name, int age, int* scores);
Student(const Student& stu); // 拷贝构造函数
void print();
~Student();
private:
string name;
int age;
int* scores;
};
Student::Student(string name, int age, int* scores)
{
this->name = name;
this->age = age;
this->scores = new int[3];
for (int i = 0; i < 3; i++)
{
this->scores[i] = scores[i];
}
}
Student::Student(const Student& stu) // 拷贝构造函数
{
this->name = stu.name;
this->age = stu.age;
this->scores = new int[3];
for (int i = 0; i < 3; i++)
{
this->scores[i] = stu.scores[i];
}
}
void Student::print()
{
cout << "Name: " << this->name << endl;
cout << "Age: " << this->age << endl;
cout << "Scores: ";
for (int i = 0; i < 3; i++)
{
cout << this->scores[i] << " ";
}
cout << endl;
}
Student::~Student()
{
if (this->scores)
{
delete[] this->scores;
}
}
void print(Student stu)
{
cout << "Print a Student object: " << endl;
stu.print();
}
int main()
{
int scores[3] = {90, 80, 70};
Student stu1("Tom", 18, scores);
Student stu2 = stu1; // 调用一次拷贝构造函数
stu2.print();
print(stu1); // 调用一次拷贝构造函数
return 0;
}
拷贝构造函数示例2:浅拷贝
在以下示例中,我们定义了一个沙漏类,并定义了两个对象Hourglass1和Hourglass2,其中Hourglass1的high属性指向一个动态分配的int型变量,并在析构函数中释放空间,而Hourglass2则是Hourglass1的复制。由于没有自定义的拷贝构造函数来完成深拷贝,因此默认的拷贝构造函数将进行浅拷贝,即直接将指针复制过去,导致两个对象共享同一块内存空间。在释放Hourglass2时,由于析构函数会先释放这块空间,而当再次释放Hourglass1时,程序因为重复释放内存空间而抛出异常。
#include<iostream>
#include<cstring>
using namespace std;
class Hourglass
{
public:
Hourglass(int myHigh = 10);
Hourglass(const Hourglass& hg); // 拷贝构造函数
~Hourglass();
void PrintHourGlassHeight();
private:
int high;
int* low;
};
Hourglass::Hourglass(int myHigh)
{
high = myHigh;
low = new int[high];
memset(low, 0, sizeof(int) * high);
}
Hourglass::~Hourglass()
{
delete[] low;
cout << "Release Hourglass memory successfully!" << endl;
}
Hourglass::Hourglass(const Hourglass& hg) // 拷贝构造函数
{
high = hg.high;
low = hg.low;
}
void Hourglass::PrintHourGlassHeight()
{
cout << "The high of the Hourglass: " << high << endl;
}
int main()
{
Hourglass Hourglass1;
Hourglass Hourglass2(Hourglass1); // 调用一次拷贝构造函数
Hourglass2.PrintHourGlassHeight();
return 0;
}
总结
C++中的拷贝构造函数是一种特殊的构造函数,用于关于同类对象进行复制初始化。适当地使用拷贝构造函数可以避免问题出现,但若不谨慎使用则可能会造成内存空间重复释放的问题。在使用时,需要考虑数据的类型、数据的大小等多方面的因素,针对性地选择不同的拷贝构造函数实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++超详细讲解拷贝构造函数 - Python技术站