我正在用类来进行一个个人项目的开发,但是不想手动初始化每个数据成员。所以在构造函数中调用了 *((Classname *)(this)) = {};
。希望它能按照我预期的方式运作。
#include <iostream>
struct Test1
{
int data1;
int data2;
void print()
{
std::cout << data1 << ' ' << data2 << std::endl;
}
};
class Test2
{
int data1;
int data2;
public:
Test()
{
*(Test *)(this) = {};
}
void print()
{
std::cout << data1 << ' ' << data2 << std::endl;
}
};
int main()
{
Test1 t1;
t1 = {}; /* I wanted the *((Classname *)(this)) = {}; to behave this way
* i.e. being able to initialise members with a initialisation list*/
t1.print();
Test2 t2;
t2.print();
return 0;
}
尽管没有产生编译错误,但是创建Test2对象时会导致分段错误。
是否有另一种初始化所有数据成员为0的方式,或者我们不能在初始化列表中使用this
吗?如果是这样,为什么?还是我无意中遇到了未定义的行为?
[如果它是编译器相关的,请注意,我正在使用gcc编译器(gcc版本7.5.0(Ubuntu 7.5.0-3ubuntu1〜18.04))]
*(Test *)(this) = {};
应该做什么。这种方式初始化成员不太清楚。预期的输出是什么? 这行代码使用空花括号初始化*(Test *)(this)
所指向的对象,即当前对象的所有成员变量将被初始化为它们各自类型的默认值。这句代码的预期输出是没有输出,而是在当前对象中初始化所有成员变量。 - 463035818_is_not_a_numberint data1 = 0;
。 - UnholySheep{}
创建了一个类型为Test
的临时对象,并通过默认构造函数进行初始化,然后运行了={}
,接着... - Daniel Langrthis
可以被取消引用,但这并不是你代码中的问题。 - 463035818_is_not_a_number