C++ 在C++;
我想使用相同的变量,但我想重新实例化它。如何在C++中实现? 下面是一个简单的例子。我试图重新实例化t1,但它无法编译。(注意t1存储在堆栈中。我不是问如何进行动态内存分配) 我建议改为使用,但如果确实要在同一变量中重新创建新对象,请使用placement new:C++ 在C++;,c++,C++,我想使用相同的变量,但我想重新实例化它。如何在C++中实现? 下面是一个简单的例子。我试图重新实例化t1,但它无法编译。(注意t1存储在堆栈中。我不是问如何进行动态内存分配) 我建议改为使用,但如果确实要在同一变量中重新创建新对象,请使用placement new: Table t1(3); t1.~Table(); new (&t1) Table(4); Placement new只是在您提供的内存中构造一个对象,而不进行任何分配 如果决定使用swap,则必须编写swap函数,然后执
Table t1(3);
t1.~Table();
new (&t1) Table(4);
Placement new只是在您提供的内存中构造一个对象,而不进行任何分配
如果决定使用swap,则必须编写swap函数,然后执行重新实例化:
Table t1(3);
Table(4).swap(t1);
我建议改为使用,但如果确实要在同一变量中重新创建新对象,请使用placement new:
Table t1(3);
t1.~Table();
new (&t1) Table(4);
Placement new只是在您提供的内存中构造一个对象,而不进行任何分配
如果决定使用swap,则必须编写swap函数,然后执行重新实例化:
Table t1(3);
Table(4).swap(t1);
你为什么要重新交往?那不是雷伊 实例化是为对象获取空间,然后调用构造函数。如果您只想更改成员值,或调用某个方法,请创建某个init方法,并在构造函数中和需要重置对象时调用它。这在简单的情况下有效,因为总线与构造函数并不完全相同。有些事情(比如初始化引用成员)只能在只存在于构造函数中的初始化列表中完成 显然,您应该注意一些,因为在重新分配成员变量之前,应该为其调用析构函数 Placement new也会起作用,但看起来有点过头了,您不会比通过调用简单的方法来重置对象得到更多。这是危险的,因为它会导致非常棘手的错误 如果继续重载赋值运算符轨道,Ben Voight建议的交换习惯用法可能是您的最佳选择 我的建议是不要重新联系 使用全新实例而不使用旧实例有什么问题?在C语言中,为不同的任务重用相同的变量已经不是一个好主意,因为这会使编译器优化更加困难。它仍然是C++的,而且它也很危险,因为你很容易忘记调用第一个对象的析构函数并陷入麻烦。
在某些情况下,您需要这样做,例如,如果您获取了对象的地址,并希望更改其成员。但在这种情况下,最好还是修改代码以避免这样做。我看不出有必要这样做的真实情况。如果有,我很想知道 你为什么要重新交流?那不是雷伊 实例化是为对象获取空间,然后调用构造函数。如果您只想更改成员值,或调用某个方法,请创建某个init方法,并在构造函数中和需要重置对象时调用它。这在简单的情况下有效,因为总线与构造函数并不完全相同。有些事情(比如初始化引用成员)只能在只存在于构造函数中的初始化列表中完成 显然,您应该注意一些,因为在重新分配成员变量之前,应该为其调用析构函数 Placement new也会起作用,但看起来有点过头了,您不会比通过调用简单的方法来重置对象得到更多。这是危险的,因为它会导致非常棘手的错误 如果继续重载赋值运算符轨道,Ben Voight建议的交换习惯用法可能是您的最佳选择 我的建议是不要重新联系 使用全新实例而不使用旧实例有什么问题?在C语言中,为不同的任务重用相同的变量已经不是一个好主意,因为这会使编译器优化更加困难。它仍然是C++的,而且它也很危险,因为你很容易忘记调用第一个对象的析构函数并陷入麻烦。
在某些情况下,您需要这样做,例如,如果您获取了对象的地址,并希望更改其成员。但在这种情况下,最好还是修改代码以避免这样做。我看不出有必要这样做的真实情况。如果有,我很想知道 答案是一个很棒的语言功能,叫做作业 简而言之,您可以使用
=
符号更改变量的值,甚至是您自己定义的类型的变量
事实上,您的代码已经在使用赋值,即在构造函数中
在下面的示例中,我用初始值设定项替换了原始代码的赋值,因为初始值设定项通常更可取(在没有充分理由使用赋值来初始化成员时选择它们)
更新t1
值的赋值,有效地“重用”t1
,可以如下所示:
class Table
{
private:
int feet;
public:
Table( int x ): feet( x ) {}
};
Table t1( 3 );
t1 = Table( 4 );
注1:可以定义一个类型以禁止赋值
注2:由于您已经定义了一个转换构造函数,一个接受单个参数的构造函数,并且该构造函数不是显式的,所以上面的赋值可以更简单(但可能不太清楚)地表示为
…结果完全相同
注3:你所呈现的代码不会编译,它只是“喜欢”C++,不是C++。我已经修复了错误(我想,但我没有费心通过编译器运行它)。但一般来说,不可能知道甚至猜测所呈现代码中的错误是否与问题有关,所以请复制并粘贴真实代码
干杯,答案是一个很棒的语言功能,叫做作业 简而言之,您可以通过我们更改变量的值,甚至是您自己定义的类型的变量
Table t1(3);
t1.~Table();
new (&t1) Table(4);