【发布时间】:2020-01-09 06:14:09
【问题描述】:
我有一个指向 char 的类。我想知道如果没有明确定义复制构造函数,复制构造怎么可能?
我假设是因为对象已经被分配,但如果是这样,那么为什么有人首先需要复制构造函数?
#include <iostream>
#include <cstring>
class Data {
public:
explicit Data(const char* newData)
:size{strlen(newData)},
data{size ? new char[size] : nullptr}
{
std::memcpy(data, newData, size);
}
friend std::ostream& operator<<(std::ostream& ost, const Data& rhs) {
for (std::size_t i = 0; i < rhs.size; i++) {
std::cout << rhs.data[i];
}
ost << "\n";
return ost;
}
~Data() {
delete[] data;
}
private:
std::size_t size;
char* data;
};
int main() {
Data data1{"data1"};
Data data2{data1}; // copy constructor
std::cout << data1;
std::cout << data2;
return 0;
}
输出:
data1
data1
拷贝构造函数不应该是这样的吗?我经常看到这样的例子。但是既然默认构造函数已经这样做了,那我什么时候真正需要定义复制ctor呢?
Data(const Data& other) {
if (this != &other) {
size = other.size;
data = new char[size];
std::memcpy(data, other.data, size);
}
}
顺便说一句,我意识到代码引入了一些 maul 实践(例如,使用 new 而不是智能 ptrs,首先不使用字符串等 - 但这只是一个练习)。
【问题讨论】:
-
您不需要在复制构造函数中检查
this != &other,因为尚未构造的对象不能与给定对象相同(您不能传递不存在的对象)。不过,此检查在复制赋值运算符中很有用 :)
标签: c++ oop copy-constructor