Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++ - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,C++,我想使用相同的变量,但我想重新实例化它。如何在C++中实现? 下面是一个简单的例子。我试图重新实例化t1,但它无法编译。(注意t1存储在堆栈中。我不是问如何进行动态内存分配) 我建议改为使用,但如果确实要在同一变量中重新创建新对象,请使用placement new: Table t1(3); t1.~Table(); new (&t1) Table(4); Placement new只是在您提供的内存中构造一个对象,而不进行任何分配 如果决定使用swap,则必须编写swap函数,然后执

我想使用相同的变量,但我想重新实例化它。如何在C++中实现? 下面是一个简单的例子。我试图重新实例化t1,但它无法编译。(注意t1存储在堆栈中。我不是问如何进行动态内存分配)

我建议改为使用,但如果确实要在同一变量中重新创建新对象,请使用placement new:

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);