我有两个这样简单的结构:
struct Point{
double x, y;
};
像这样定义
之间有什么区别struct Circle{
Point *P;
float radius;
};
和这个
struct Circle{
Point *P = new Point;
float radius;
};
如果我使用第一个样本并在main
函数
Circle *C = new Circle;
C -> P = new Point;
答案 0 :(得分:5)
此:
struct Circle{
Point *P = new Point;
float radius;
};
使用C ++ 11类内初始化。这意味着默认情况下,如果没有其他构造函数(在您的示例中没有),P
将被设置为new Point
任何构造的Circle
。这相当于您创建P
后明确设置Circle
的示例的代码行数。
当然,使用您提供的示例代码,您最好只使用值而不是指针:
struct Circle{
Point P;
float radius;
};
然后Point
内总会有Circle
,我们不必在资源管理,内存泄漏等方面进行长时间的尴尬谈话。
答案 1 :(得分:4)
您的两个示例之间没有任何性能或行为差异,但通常,您应该将资源分配(和释放)放在拥有数据的类中。这样,负责分配和解除分配是合乎逻辑的。
我假设这是一个简化的例子,并且不建议完全删除指针。
答案 2 :(得分:2)
这是一个C ++ 11特性:非静态数据成员的类内初始化,并通过分配内存直接初始化指针(if no other constructor does the same thing in the member initialization list of a constructor)
struct Circle{
Point *P = new Point;
float radius;
};
与
等效(即没有性能差异)Circle *C = new Circle;
C -> P = new Point;
但你应该不使用它们,否则你会泄漏内存。建议使用智能指针。
对于像Point
这样的对象,我还建议将其保留为子对象,而不是指针。
答案 3 :(得分:1)
两种解决方案之间没有干预优势,差别不大。
但是,严格考虑不使用动态分配和指针来存储这种微小的数据结构[1]。这是因为动态分配不仅需要额外的时间(调用new
),而且需要更多内存(在大多数操作系统中,存在16字节或更多的开销,并且大小被四舍五入到至少16字节边界x86体系结构,允许SSE访问动态分配的内存)。所以你的16个字节的两个double
现在占用了8个字节的指针,32个字节的分配空间(开销+舍入),总共40个字节 - 比直接放置的字节多24个字节圆形物体。
每次(嗯,任何函数中的第一个)访问P
成员时,需要有一个指针取消引用来查找x
和y
内的位置Point
。
您需要以某种方式确保delete
Point
个对象。
当然有些情况需要指向小对象的指针,例如当它们具有虚拟成员函数时。
[1]特别是因为我说你的Circle
对象在没有Point
的情况下无法定义你的圈子所在的位置。当对象是可选的时,有一个参数可以使用指针,因为您可以使用NULL
来指示它不存在。