C++成员初始化

C++ member initialization

本文关键字:初始化 成员 C++      更新时间:2023-10-16

下面是我学习复制构造函数和赋值运算符概念的代码。我指的是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 << "bb 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
} 

如果您只是打开所有可能的警告,编译器会告诉您这些问题。