下面是对于“C++类中三大函数详解(构造、析构和拷贝)”的完整攻略:
构造函数
定义
构造函数是C++中用来初始化类对象的第一个函数,它的名称与类名相同,没有返回类型,且可以被重载。
特点
构造函数有以下特点:
- 构造函数在类实例化时自动调用。
- 构造函数可以被重载,可以有多个不同版本。
- 构造函数可以带有参数,也可以没有参数。
- 构造函数可以被派生类隐式调用,但只在派生类构造函数中显式调用。
构造函数的种类
C++中的构造函数有以下几种:
- 默认构造函数:没有参数的构造函数。
- 带参数构造函数:含有一个或多个参数的构造函数,它们通常被用于给对象的成员变量初始化。
- 拷贝构造函数:用来将一个已存在的对象中的数据复制到新对象中的构造函数。
- 移动构造函数:用于将一个可移动的对象中的对象偷过来的构造函数。
- 委派构造函数:调用同一个类中的另一个构造函数。
示例说明
下面是一个包含参数的构造函数的示例:
#include <iostream>
using namespace std;
class Rectangle {
private:
int length;
int width;
public:
Rectangle(int l, int w) {
length = l;
width = w;
}
int calculateArea() {
return length * width;
}
};
int main() {
Rectangle r(10, 5);
cout << "Area of the Rectangle: " << r.calculateArea() << endl;
return 0;
}
在上面的代码中,我们定义了一个名为Rectangle的类,并在该类中定义了一个接受两个参数的构造函数。在main函数中,我们创建了一个名为r的Rectangle对象并将其长度和宽度设置为10和5。最后,我们调用了calculateArea函数计算矩形的面积并输出结果。
析构函数
定义
析构函数是C++中用来释放对象所占用内存的函数,它与类名相同,以~字符作为前缀,没有返回类型,也不需要参数。
特点
析构函数有以下特点:
- 当对象在作用域结束时,析构函数会自动调用。
- 一个类只能有一个析构函数,不过析构函数可以被重载。
- 析构函数不能被继承。
示例说明
下面是一个简单的析构函数示例:
#include <iostream>
using namespace std;
class MyClass {
private:
int *p;
public:
MyClass(int x) {
p = new int;
*p = x;
}
~MyClass() {
delete p;
}
};
int main() {
MyClass obj(5);
return 0;
}
在上面的代码中,我们定义了一个名为MyClass的类,并在该类中使用new关键字为p指针分配了内存。在main函数中,我们创建了一个名为obj的MyClass对象,并在obj离开作用域时自动释放了p指针所指的内存。
拷贝构造函数
定义
拷贝构造函数是一种构造函数,它与类名相同,并用已存在的对象初始化新对象。如果没有显式定义拷贝函数,则编译器将使用默认的拷贝构造函数。
特点
拷贝构造函数有以下特点:
- 当以值传递的方式将对象传递给函数时,拷贝构造函数将被调用。
- 当对象被动态分配或返回值时,拷贝构造函数将被调用。
- 如果没有显式定义拷贝构造函数,则编译器将提供默认的拷贝构造函数。
示例说明
下面是一个简单的拷贝构造函数示例:
#include <iostream>
using namespace std;
class Person {
private:
string *name;
int age;
public:
// Constructor
Person(string n, int a) {
name = new string;
*name = n;
age = a;
}
// Copy Constructor
Person(const Person &p) {
name = new string;
*name = *p.name;
age = p.age;
}
// Destructor
~Person() {
delete name;
}
void display() {
cout << "Name: " << *name << endl;
cout << "Age: " << age << endl;
}
};
int main() {
Person p1("John", 25);
Person p2 = p1; // Copy Constructor Called
p1.display();
p2.display();
return 0;
}
在上面的代码中,我们定义了一个名为Person的类,并使用new关键字为name分配了内存。在该类中,我们重载了拷贝构造函数,并在其中使用new关键字为新对象的name成员分配了内存,并将原始对象的name成员的值复制到新对象的name成员中。在main函数中,我们创建了两个名为p1和p2的Person对象,其中p2对象使用了拷贝构造函数将p1对象中的数据复制到p2对象中,最后我们调用display函数输出两个对象的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类中三大函数详解(构造、析构和拷贝) - Python技术站