长时间读者第一次发布海报。搜索这个是非常模糊的,所以我找不到任何东西。
Anywho,如果我在类中声明一个struct。然后我有一个类方法创建所述struct的实例,创建的struct实例的生命周期是什么?
例如在我的标题中:
class test_class
{
Public:
void test_function(int, string);
private:
struct test_struct
{
int foo;
string bar;
};
test_struct * storage;
}
然后在test_class.cpp
中void test_function(int num, string name)
{
test_struct t1;
t1.foo = num;
t1.bar = name;
storage = new test_struct [<some_size>];
storage[<some_element>] = t1;
}
所以,我创建了一个test_class的实例并调用了test_function。创建t1然后成功存储在假设数组中,但它是否保存在数组中?或者当函数退出时它会被删除,因为范围会发生变化吗? t1会成为该类的成员变量吗?我是否需要t1作为指向test_struct的指针并拥有一个test_struct指针数组?
提前感谢您的帮助。
答案 0 :(得分:1)
Lifetime与类定义的嵌套无关。
本声明
test_struct t1;
声明一个局部变量,其生命周期结束于包含声明的块的右右括号。它声明了一个局部变量,因为它位于函数定义的块中。
本声明
storage = new test_struct [<some_size>];
动态创建<some_size>
test_struct
个实例。当你delete[]
时,该数组的生命周期结束。如果你这样做。
本声明
storage[<some_element>] = t1;
是复制作业,复制t1
的值。它不会创建新实例。
查看SO C++ booklist以查找适合您的C ++教科书。如果可以,请让声誉较高的人帮助您,以便you can read the deleted answers。遗憾的是,现有的社区工作一度被删除,取而代之的是摘要。
答案 1 :(得分:-1)
查看您的问题,看起来您对类中的结构类型感到困惑。如果它有帮助,这里有一点解释 与
struct test_struct
{
int foo;
string bar;
};
在课堂上,你刚刚创建了一个封装在课堂内的新类型。 (像任何其他类型一样对待它)。
你的问题的答案
创建1.t1然后成功存储在假设数组中,但它是否保存在数组中?或者当函数退出时它会被删除,因为范围会改变吗?
答案:是的,它会复制到数组中,如上一个答案所述。它是一个复制赋值(逐位复制语义),因此,你的数组元素现在具有从t1复制到它的值
答案:t1是一个局部变量(在堆栈上分配),它不是该类的成员变量。在堆上分配存储(新),你有一个test_struct元素数组,然后你只需将本地t1的值复制到你的数组。本质上,在t1超出范围时,在t1被销毁之前,你将t1的值复制到数组。你不需要创建一个指向test_struct的数组,(当然,如果有一些强迫性的原因,在这种情况下你也会为test_struct分配内存)。
你的&#34;存储&#34;成员在堆上分配,因此,请确保调用delete []来回收内存。
希望它有所帮助!