void foo (Time t)
{
t = Time(12, 0, 0);
}
void bar (Time* t)
{
t = new Time(12, 0, 0);
}
int main(int argc, char *argv[])
{
Time t;
foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor.
bar(&t);//t is (12,0,0)
return 0;
}
9条答案
按热度按时间oug3syen1#
该行:
...在局部作用域中分配一个
Time
类型的变量,通常在堆栈上分配,当作用域结束时将被销毁。相比之下:
...通过调用
::operator new()
或Time::operator new()
来分配内存块,并且随后调用Time::Time()
,其中this
被设置为该内存块内的地址(也作为new
的结果返回),然后将其存储在t
中。这通常是在堆上完成的(默认情况下),并且要求您稍后在程序中执行delete
,而t
中的指针通常存储在堆栈上。new
创建的对象被称为具有"动态存储持续时间",并且仅在delete
d时才销毁。实际上,这意味着自动变量在堆栈上创建和销毁,动态对象存储在堆上, 但这不是语言所要求的 *。9jyewag02#
一个更明显的区别是在访问t的变量和方法时。
zzoitvuj3#
就构造函数而言,这两种形式在功能上是相同的:它们只会导致构造函数在一个新分配的对象示例上被调用,你似乎已经很好地理解了分配模式和对象生存期的区别。
eoxn13cs4#
我想你已经理解了所有的区别,假设你很清楚通过指针和通过变量访问t的成员的语法区别(嗯,指针也是一个变量,但我想你明白我的意思),同时假设你知道在传递t给函数时,传值调用和传引用调用的区别。我想你们也知道,如果你把t赋给另一个变量,然后改变另一个变量,结果会不同,取决于t是否是指针。
flvtvl505#
pepwfjgg6#
在堆栈上分配对象和在堆上分配对象在功能上没有区别,都将调用对象的构造函数。
顺便说一句,我建议您使用boost的shared_ptr或scoped_ptr,它们在堆上进行分配时功能也是等效的(scoped_ptr的额外用处是限制您复制不可复制的指针):
rpppsulh7#
与你已经知道的没有其他区别。
假设您的代码正在使用默认运算符new的服务。
11dmarpk8#
No ..没有其他区别..
k5ifujac9#