繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM