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;
}
虽然没有生成任何编译错误,但在创建类 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;
相关文章:
- 如果'C'公开继承'B',B 私下继承'A',为什么我不能在"C"中创建"A"的对象?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?
- 如果函数包含静态变量,为什么编译器不执行内联?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- 如果唯一指针是捕获的值,为什么它不能在 lambda 内移动?
- 如果WM_KEYDOWN起作用,为什么WM_KEYUP不起作用?
- 如果不允许使用constexpr,为什么sfinae在上面
- 如果隐式转换序列使用"Promotion",为什么它不是最好的 ICS?
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 为什么如果(!(cin >> int)) 在第一次迭代中接受十进制数,但不接受其他十进制数?
- 重复Handle()是否执行任何解释性通信(IPC),如果不是为什么目标参数
- 如果仅使用一个翻译单元使用Extern模板类,为什么我不会遇到链接错误
- 如果在我的机器上 sizeof(long) == sizeof(long long),为什么它们不是同一类型?
- 如果可能存在未定义行为,为什么编译器不警告您?