拷贝构造函数的创建与使用
时间: 2023-12-25 17:03:20 浏览: 84
拷贝构造函数的使用
拷贝构造函数是一种特殊的构造函数,它用于创建一个新对象并将其初始化为另一个已经存在的对象的副本。拷贝构造函数的原型为:
```
class MyClass {
public:
MyClass(const MyClass& other);
};
```
拷贝构造函数的参数是一个常量引用,它指向要复制的对象。拷贝构造函数可以被自动调用的情况包括:
1. 使用一个对象初始化另一个对象;
2. 将一个对象作为函数参数传递给一个函数;
3. 从函数返回一个对象。
下面是一个拷贝构造函数的示例:
```
class MyString {
public:
MyString(const char* str);
MyString(const MyString& other);
~MyString();
private:
char* m_str;
int m_length;
};
MyString::MyString(const MyString& other) {
m_length = other.m_length;
m_str = new char[m_length + 1];
strcpy(m_str, other.m_str);
}
MyString::~MyString() {
delete[] m_str;
}
```
这个示例中,我们定义了一个字符串类 `MyString`,它包含一个指向字符数组的指针 `m_str` 和一个表示字符串长度的整数 `m_length`。在拷贝构造函数中,我们首先将 `m_length` 初始化为另一个对象的长度,然后创建一个新的字符数组 `m_str`,并将其初始化为另一个对象的字符数组的副本。最后,我们使用 `delete[]` 释放内存。
使用拷贝构造函数时,我们可以使用以下两种方法:
1. 显式调用拷贝构造函数:
```
MyString str1("Hello");
MyString str2 = MyString(str1); // 显式调用拷贝构造函数
```
2. 隐式调用拷贝构造函数:
```
MyString str1("Hello");
MyString str2(str1); // 隐式调用拷贝构造函数
```
需要注意的是,如果没有为类定义拷贝构造函数,编译器将生成默认的拷贝构造函数,它将执行浅复制。这可能会导致意想不到的结果,因此在需要对象副本的情况下,最好明确地定义拷贝构造函数。
阅读全文