gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:39:24 25 4
gpt4 key购买 nike

我正在处理一个包含类的个人项目,不想为每个数据成员起草。所以我在构造函数中调用了 *((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))]

最佳答案

更新: 我刚刚发现您修改了代码,新代码现在没有任何意义。我的回答与原代码有关。

是的,您可以取消引用 this 并在其上调用成员函数,例如 this->f();(*this) .f()。同样,(*this) = ...this->operator=(...); 相同。

问题是 (*this) = {}; 导致 {} 创建一个由默认构造函数初始化的 Test 类型的临时对象.因此,您在默认构造函数中调用默认构造函数,这会导致在您的情况下永远不会结束的递归。


如果你想将成员初始化为零默认(也就是说,如果没有在构造函数成员初始化列表中另外指定),只需使用(C++11 起):

int data1 = 0;
int data2 = 0;

关于c++ - 在 C++ 中我们可以取消引用这个指针吗?如果是这样那么如何,如果不是那么为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61886098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com