我援引“富”的实例
实际上,您正在创建类Foo的实例。
具体而言,您正在通过new()从堆中分配一块内存。这块内存足够大,可以容纳Foo :: container以及任何其他开销类Foo需要。
(在这个例子中,是没有的。与其他类,可能有额外的属性或者一个虚拟指针表。)
自然地,新()调用(也许默认?)Foo :: Foo()构造函数,它依次通过std :: vector构造函数初始化Foo :: container。
变量“容器”的范围是什么?
容器是实例FOO的属性[组分]。它只要存在实例foo就存在。
适用范围,我们可以说美孚::集装箱。但是你不能访问Foo :: constainer而没有类Foo的实例。 (例如,对象foo。)Foo :: constainer不存在没有类Foo的实例。
(有类变量的工作有所不同,其中一个值的所有实例共享。但这里是不是这样的。)
此作用域是IRRELEVANT到您的公共/保护/私有/朋友成员访问控制。
例如,在一些美孚:: myPublicMethod()你可以参考美孚::容器。尽管在这种情况下你也可以放弃明确的范围,只需将其称为货柜。
提醒你,是私人的,你不能访问美孚::容器外的类Foo的方法。
这个变量是否存在,直到我删除实例foo?
是的。
我是否需要将“容器”作为指向矢量的指针?
不,你可以,但你当然不必。
一般来说,我建议不要将类实例成员作为指针与构造函数中的new相加,并在析构函数中删除。这是低效率和麻烦的。 (默认拷贝构造函数可以复制指针值,析构函数可以删除同一指针值的两倍)
根据您的需求,您可以考虑:
int main(int argc, char* argv[])
{
Foo foo;
// other method calls to which foo is passed
return 0;
}
富会返回0后超出范围;,并自动删除。而且,foo将被分配到堆栈而不是堆中。
您可能会发现用过的副本The Annotated C++ Reference Manual有用。这是旧的,但它具有很高的信噪比。
该死的,你什么时候睡觉? :) – Alastair 2009-01-01 04:25:56
很好的答案。非常感谢。对内存分配有些怀疑 1 - foo将被分配在堆上,对吧? 2 - 容器变量在哪里? – 2009-01-01 04:36:58