2009-01-01 108 views
2

我刚刚开始使用C++,并且在理解类中私有成员变量的作用域如何工作时遇到了一些问题。请看下面的代码私有成员变量范围 - C++

class Foo{ 
    private: 
     std::vector<int> container; 
    public: 
     // other methods 
}; 

int main(int argc, char* argv[]) 
{ 
    Foo* foo = new Foo; 
    // other method calls to which foo is passed 
    delete foo; 
    return 0; 
} 

在上面的代码中,变量“container”是一个私有成员变量。我调用“Foo”实例并将它传递给其他几个方法和类。以下是我的疑问

  1. 变量“容器”的范围是什么?这个变量是否存在,直到我删除实例foo?
  2. 我是否需要将“容器”作为指向矢量的指针?只要

感谢您的帮助

回答

6
  1. 是,容器构件的寿命将持续为包含它存在的对象,这是直到你的指针指向它调用delete (您的情况为foo)。
  2. 不,没有理由这样做。使它成为一个指针需要你创建一个动态对象vector<int>,你需要管理它的生命周期(包括调用容器指针的delete)。这里没有必要。假设你希望容器的最后时间与Foo对象一样长,你可以直接包含它,而不需要使用指针。

传递foo指针只会传递指针。它指向的对象将而不是被复制,只有指向它的指针才会被需要。如果你知道Java的,那么它可以帮助你,如果我告诉你传递的指针是一样的只是路过参考Java中的对象,说:

Foo f = new Foo(); 
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied 
doIt(f); 
+0

该死的,你什么时候睡觉? :) – Alastair 2009-01-01 04:25:56

+0

很好的答案。非常感谢。对内存分配有些怀疑 1 - foo将被分配在堆上,对吧? 2 - 容器变量在哪里? – 2009-01-01 04:36:58

0

我援引“富”的实例

实际上,您正在创建类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有用。这是旧的,但它具有很高的信噪比。