C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?

In C++ can we dereference this pointer? If so then how and if not then why?

本文关键字:为什么 如果不 如果 我们 取消 引用 指针 C++      更新时间:2023-10-16

我正在做一个带有类的个人项目,不想初始化每个数据成员。所以我调用了构造函数中的*((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 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;
相关文章: