[英]In C++ can we dereference this pointer? If so then how and if not then why?
我正在处理一个带有类的个人项目,并且不想初始化每个数据成员。 所以我打电话给*((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;
}
在创建 class Test2 object 时,虽然没有产生任何编译错误,但最终导致分段错误。
是否有另一种将所有数据成员初始化为 0 的方法,或者是否存在我们不能将this
与初始化列表一起使用的限制? 如果是,为什么? 或者这是我偶然发现的另一种未定义行为?
[如果它依赖于编译器,我使用的是 gcc 编译器(gcc 版本 7.5.0(Ubuntu 7.5.0-3ubuntu1~18.04))]
更新:我刚刚意识到您修改了代码,而新的代码现在没有意义。 我的回答与原始代码有关。
是的,您可以取消引用this
并在其上调用成员函数,例如this->f();
这是相同的(*this).f()
。 同样, (*this) =...
与this->operator=(...);
相同 .
问题是(*this) = {};
导致{}
创建由默认构造函数初始化的Test
类型的临时。 因此,您在默认构造函数中调用默认构造函数,这会导致在您的情况下永远不会结束的递归。
如果要默认将成员初始化为零(即,如果没有在构造函数成员初始化器列表中另行指定),只需使用(C++11 起):
int data1 = 0;
int data2 = 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.