泡沫机械
96.43M · 2026-03-24
本文承接上文,主要介绍C++语法中的另一个极其重要的成员函数——拷贝构造函数
如果一个构造函数的第一个参数是自身类型的引用,且其余参数均有默认值,那么这个构造函数就是拷贝构造函数,拷贝构造的效果如下
int main()
{
Date d1(2026, 2, 21);
d1.Print();
Func1(d1);
Date d2(d1);
d2.Print();
return 0;
}
也就是能用已经初始化的d1初始化d2,这就是拷贝构造的效果
typedef int STDataType;
class Stack
{
public:
Stack(int n = 4)
{
_a = (STDataType*)malloc(sizeof(STDataType) * n);
if (nullptr == _a)
{
perror("malloc申请空间失败");
return;
}
_capacity = n;
_top = 0;
}
// st2(st1)
Stack(const Stack& st)
{
cout << "Stack(const Stack& st)" << endl;
// 需要对_a指向资源创建同样大的资源再拷贝值
_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
if (nullptr == _a)
{
perror("malloc申请空间失败!!!");
return;
}
memcpy(_a, st._a, sizeof(STDataType) * st._top);
_top = st._top;
_capacity = st._capacity;
}
void Push(STDataType x)
{
if (_top == _capacity)
{
int newcapacity = _capacity * 2;
STDataType* tmp = (STDataType*)realloc(_a, newcapacity *
sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
return;
}
_a = tmp;
_capacity = newcapacity;
}
_a[_top++] = x;
}
~Stack()
{
cout << "~Stack()" << endl;
free(_a);
_a = nullptr;
_top = _capacity = 0;
}
private:
STDataType* _a;
size_t _capacity;
size_t _top;
};
比如栈这个结构,如果不显示写拷贝构造,那么按照字节拷贝会将st1和st2指向同一块空间,析构的时候会对一块空间析构两次,造成程序崩溃,因此需要自己写。
Stack& func2()
{
static Stack st;//不加static的话出了作用域st就不在了
return st;
}
int main()
{
Stack ret = func2();
return 0;
}
拷贝构造函数到此就介绍完了,希望读者关注下文