[英]C++ member initialization
下面是我學習復制構造函數和賦值運算符概念的代碼。 我指的是 Bjarne Stroustrup C++11 書。 但是當 Vector class 對象 go 超出 scope 時,我的程序崩潰了。 這是我寫的代碼。
#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
成員分配 memory。 由於它未初始化,因此會調用未定義的行為。 您應該使用vec.size
分配 memory:
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
}
如果您只是打開所有可能的警告,編譯器會告訴您這些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.