C++成员初始化
C++ member initialization
下面是我学习复制构造函数和赋值运算符概念的代码。我指的是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
}
如果您只是打开所有可能的警告,编译器会告诉您这些问题。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员