c++ - C++ 成员初始化
问题描述
下面是我学习复制构造函数和赋值运算符概念的代码。我指的是 Bjarne Stroustrup C++11 书。但是当 Vector 类对象超出范围时,我的程序崩溃了。这是我写的代码。
#include <iostream>
class Vector {
double* elements;
size_t size;
public:
Vector();
Vector(const Vector& vec);
Vector& operator=(const Vector& vec);
~Vector();
void print() {
for(size_t i = 0; i < size; ++i)
std::cout << elements[i] << ", ";
std::cout << "\b\b \b" << std::endl;
}
};
Vector::Vector() {
size = 10;
elements = new double[size];
for(size_t i = 0; i < size; ++i)
elements[i] = i + 1;
}
Vector::~Vector() {
if(elements != nullptr)
delete[] elements;
}
Vector::Vector(const Vector& vec) : elements { new double[size] }, size { vec.size } {
for(size_t i = 0; i < size; ++i)
elements[i] = vec.elements[i];
}
Vector& Vector::operator=(const Vector& vec) {
size = vec.size;
if(elements != nullptr)
delete[] elements;
elements = new double[size];
for(size_t i = 0; i < size; ++i)
elements[i] = vec.elements[i];
}
int32_t main(int32_t argc, char* argv[]) {
Vector vec1;
std::cout << "vec1 elements are: " << std::endl;
vec1.print();
Vector vec2 = vec1;
std::cout << "vec2 elements are: " << std::endl;
vec2.print();
return EXIT_SUCCESS;
}
解决方案
您的代码中有 2 个问题。首先,在构造函数中,您使用当前size
成员来分配内存。由于它未初始化,因此会调用未定义的行为。您应该使用vec.size
来分配内存:
Vector::Vector(const Vector& vec) : elements { new double[vec.size] }, size { vec.size } {
// ^^^
// ...
}
其次,您不会从operator=
其中返回也会调用未定义的行为。
Vector& Vector::operator=(const Vector& vec) {
// ...
return *this; // you need to return
}
如果您只是打开所有可能的警告,编译器会告诉您这些问题。
推荐阅读
- sql - 获取 PLS-00382:表达式类型错误
- fluid - 翻译 powermail 表格
- rust - 在循环/赋值中:预期类型参数`T`,找到`&T`
- flutter - Flutter - 只要用户按下小部件,就可以更改文本样式
- python - 使用特殊字符格式化字符串
- python - pandas - 在特定单词之后加入单词
- r - 使用 rep() 函数时的“次”参数无效
- html - 图中的“可聚焦元素应具有交互式语义”是什么意思?
- c# - 测试 .net core 2.2 web api 控制器时收到 InvalidOperationException 错误
- angular - 我应该取消订阅 observable 以防万一吗?