第一个与第二个不同。
在这种特定情况下,它们可能会产生相同的结果。然而,Point可以很容易地实现一个赋值运算符new Point
并做一些“不同”的事情(我没有这本书,所以我不知道每一个细节)。同样,赋值运算符应该做你所期望的......但是, thePoint可能是一个容器(例如,智能指针),它可能(出于某种奇怪的原因)在使用initialization(Point)
vs时表现不同default initialization followed by assignment
。
在这种情况下,这些细节可能无关紧要,但它们确实会影响初始化顺序和执行。当您的程序增长时,差异将很重要。那时,初始化需要时间,并且您需要确保对象被正确初始化:它们被正确构造(第一次)并且它们以正确的顺序构造。最明显的情况:当默认构造函数的行为与带参数的构造函数不同时,它会有所不同,特别是当构造函数产生分配或具有其他耗时(或行为不同)的副作用时。
而且,由于我们在构造函数中执行此操作,为 int x 和 int y 分配的值是什么?
这完全取决于Point
的构造函数。
我们应该在 new Point(x,y) 中写入 x 和 y 的值吗?或者,这样是正确的?
首选方法(对于大多数团队)是尽可能使用初始化列表和正式构造函数,并编写您的类型以支持正确的初始化。当代码库增长时,会出现很多微妙之处。此构造函数使用初始化列表:
HeapPoint::HeapPoint(int x, int y): thePoint(new Point(x,y)) { }
如果您想像这样声明 thePoint,则在假设的情况下可能需要正确的初始化:
const Point* const thePoint;
第一个const
意味着您不能修改该点(例如,Point.x
或Point.y
)。第二个 const 意味着您不能为变量分配新的分配。OP 中示例的琐碎示例,但随着程序的增长绝对有帮助。