我有几个问题,我很乐意提供帮助。
您是否可以仅为基本类型创建函数模式?
如果程序员没有明确定义它们,那么会以合理方式配置Setters \ getters吗?
class CreateDestroy {
public:
CreateDestroy() { cout << "create "; }
~CreateDestroy() { cout << "destroy "; }
};
int main() {
CreateDestroy* c1;
for (int i = 1; i <= 2; i++)
CreateDestroy c2;
return 0;
}
当我在main中创建CreateDestroy * c1时,是print create吗?并在程序结束时打印销毁?
create create destroy create destroy
如果我在main中有CreateDestroy c1;
(没有*
)它会改变打印吗?
或者如果我有CreateDestroy* c1 = new CreateDestroy;
是否将打印更改为?
如果我打电话给删除c1;在主要:
int main() {
CreateDestroy* c1 = new CreateDestroy;
for (int i = 1; i <= 2; i++)
CreateDestroy c2;
delete c1; // !
return 0;
}
当我打电话删除它会打印吗? 这意味着我没有打电话给删除的所有时间都没有打印?
我很乐意解释,更好地理解
感谢&#39;第
答案 0 :(得分:1)
我认为主要问题是区分自动与动态storage duration,与scope的概念紧密相关:
自动存储时间。对象是 在封闭代码块的开头分配并取消分配 在末尾。除了那些之外,所有本地对象都有此存储持续时间 声明为static,extern或thread_local。
动态存储时间。 通过使用动态,按请求分配和取消分配对象 内存分配函数。
关于CreateDestroy* c1
,你定义了一个指针类型的变量,它本身不会创建一个CreateDestroy
类型的对象(它只是一个保存这种类型的对象的内存地址的值)位于稍后)。因此,通过声明此指针变量,不会调用构造函数或析构函数,因为不会创建或销毁CreateDestroy
- 对象。但是,如果您编写c1 = new CreateDestroy()
,则会创建一个新对象,此时将完全调用构造函数。以这种方式创建的对象具有动态存储持续时间,即它将“活动”直到您明确调用delete c1
。当且仅当您调用delete c1
时才会调用析构函数。
关于CreateDestroy c2
- 循环块中声明的for
,对象的automatic storage duration
连接到for循环中块的范围。注意 - 在执行时 - 每次迭代代表它自己的块实例,这样用块作用域声明的对象是在每次迭代时创建的(在声明点,触发构造函数),并且在结束时也被销毁。每次迭代(在块的末尾,触发析构函数)。
希望它有所帮助。