类中含有指针的构造函数
时间: 2023-07-20 17:23:22 浏览: 61
当类中含有指针类型的成员变量时,需要在构造函数中动态分配内存并进行初始化,以防止出现内存泄漏或野指针等问题。以下是一个示例:
```c++
class MyClass {
public:
MyClass(int size) {
ptr = new int[size];
for(int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
length = size;
}
~MyClass() {
delete[] ptr;
}
private:
int* ptr;
int length;
};
```
在上面的示例中,构造函数中通过 `new` 关键字动态分配了一个 `int` 数组,并初始化了其中的元素。在析构函数中,需要使用 `delete[]` 释放指针所指向的内存空间。这样可以保证在对象销毁时,内存空间能够得到正确的释放。
相关问题
请写一个构造函数含有指针、析构函数、深拷贝的例子
好的,以下是一个包含指针、析构函数和深拷贝的示例类:
```cpp
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "Constructor called" << std::endl;
data = new int(0);
}
~MyClass() {
std::cout << "Destructor called" << std::endl;
delete data;
}
// 深拷贝构造函数
MyClass(const MyClass& other) {
std::cout << "Copy constructor called" << std::endl;
data = new int(*other.data);
}
// 深拷贝赋值运算符
MyClass& operator=(const MyClass& other) {
std::cout << "Assignment operator called" << std::endl;
if (this != &other) {
delete data;
data = new int(*other.data);
}
return *this;
}
private:
int* data;
};
int main() {
MyClass obj1; // 调用构造函数
MyClass obj2 = obj1; // 调用深拷贝构造函数
MyClass obj3; // 调用构造函数
obj3 = obj1; // 调用深拷贝赋值运算符
return 0;
}
```
在上面的示例中,我们定义了一个名为`MyClass`的类,其中包含了一个指向整数的指针`data`。构造函数用于初始化`data`指针,析构函数用于释放`data`指针所指向的内存空间。
此外,我们还定义了深拷贝构造函数和深拷贝赋值运算符,以确保在拷贝或赋值对象时,不会共享指针所指向的内存空间,而是创建一个新的内存空间,并将其复制给新对象。
在`main`函数中,我们创建了三个`MyClass`对象,分别调用了构造函数、深拷贝构造函数和深拷贝赋值运算符。当这些对象超出作用域时,析构函数将被自动调用,释放内存空间。
链表的拷贝构造函数含tail结点
链表的拷贝构造函数含tail结点的实现方式与不含tail结点的略有不同,以下是一个示例:
```cpp
template <typename T>
LinkedList<T>::LinkedList(const LinkedList<T>& other) {
if (other.head == nullptr) {
head = tail = nullptr;
} else {
head = new Node(other.head->data);
Node* curr = head;
Node* otherCurr = other.head->next;
while (otherCurr != nullptr) {
curr->next = new Node(otherCurr->data);
curr = curr->next;
otherCurr = otherCurr->next;
}
tail = curr;
}
}
```
这里我们首先判断 `other` 链表是否为空,如果是,则直接将 `head` 和 `tail` 置为 `nullptr`。如果不为空,则将 `head` 指向一个新的节点,并将 `other.head` 的数据复制到新节点中。然后使用两个指针 `curr` 和 `otherCurr` 分别指向当前链表和被拷贝链表的当前节点。我们在循环中遍历被拷贝链表,将其每个节点的数据复制到新链表中,并将 `curr` 指针指向新节点,`otherCurr` 指针指向被拷贝链表的下一个节点。循环结束后,将 `tail` 指向 `curr`,即为新链表的尾部节点。