初始化 C++ 对象/结构体

14 浏览
0 Comments

初始化 C++ 对象/结构体

除了动态内存分配之外,下面两行代码之间有功能上的区别吗:

Time t (12, 0, 0); //t is a Time object
Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object

当然我假设已经定义了 Time(int, int, int) 构造函数。我也意识到在第二种情况下,t 需要被删除,因为它是在堆上分配的。还有其他区别吗?

admin 更改状态以发布 2023年5月24日
0
0 Comments

另一个明显的区别是访问 t 的变量和方法时的方式。

Time t (12, 0, 0);
t.GetTime();
Time* t = new Time(12, 0, 0);
t->GetTime();

0
0 Comments

这行代码:

Time t (12, 0, 0);

... 在本地作用域中分配了一个Time类型的变量,通常在堆栈上,这个变量将在其作用域结束时被销毁。

相比之下:

Time* t = new Time(12, 0, 0);

... 通过调用::operator new()Time::operator new()来分配一个内存块,并随后使用this设置为该内存块内的地址(同时作为new的结果返回),然后将其存储在t中的Time::Time()。正如你所知,这通常在堆上(默认情况下)完成,需要在程序中稍后delete它,而t中的指针通常存储在堆栈中。

N.B.: 这里我使用的"通常"是指常见的实现方式。C++标准不以机器的堆栈和堆作为区别,而是以它们的生存期为区别。本地作用域的变量具有"自动存储期",因此在本地作用域结束时被销毁;而使用new创建的对象具有"动态存储期",只有在delete时才会被销毁。在实际应用中,这意味着自动变量在堆栈上创建和销毁,而动态对象存储在堆上,但语言不要求如此。

0