将对象创建为私有成员变量与成员函数

时间:2015-07-01 07:12:55

标签: c++ oop object private-members member-functions

在类声明中创建对象作为私有成员变量和在类的方法定义中创建对象有什么区别?我知道明显不同的是,一个是全局变量,另一个是局部变量。我应该在什么情况下做前者和后来?

Aclass.h

class Aclass{ 
private: 
    AnotherClass someobj1; //option 1
public:  
    void someMethod(); 
};

Aclass.cpp

void Aclass::someMethod(){ 
    AnotherClass someobj2; //option 2 
}

5 个答案:

答案 0 :(得分:5)

someobj1确实是一个成员变量。这意味着AClass 的每个实例都包含名为AnotherClass的{​​{1}}实例,其实例与其所属实例的生命周期相同。

someobj1someobj2函数的局部变量。它将在所述功能结束时销毁。

他们都不是全球性的。也许你将它们与静态成员变量混合在一起,这些变量具有静态生命周期(在someMethod开始之前构建,在结束后销毁),就像全局变量一样(但是它们是'不完全是全球性的,因为它们被包含在课程范围内。

这是一个非常明确的例子:

main

答案 1 :(得分:0)

我们可以将对象用作私有成员来定义关联合成聚合等概念。

请考虑以下代码段:

//ASSOCIATION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar=_bar;
    }
};

//AGGREGATION
class Bar
{
    Baz baz;
};

class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar = new Bar;
        bar->baz=_bar->baz;
    }
};


//COMPOSTION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar bar;
}

我的理解是:

  1. 关联:Foo有一个指向Bar对象的指针作为数据成员
  2. 聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。
  3. 撰写:Foo有一个Bar对象作为数据成员。
  4. 然而,无论何时将对象用于较短的时间跨度(而不是包含它的对象的整个生命周期),都需要第二种用法(成员函数定义中的对象创建)。

    另一个区别是参考记忆:

      

    作为数据成员的对象将被分配内存并保留到   物体死了。但是,对象作为成员中的变量   函数将被分配内存并在每次释放时释放   功能超出范围。

答案 2 :(得分:0)

成员变量(无论其可见性如何)都存在于整个实例的生命周期中。只要您拥有if(fileToRead.exists())的实时实例,它就会保留AClass的值。这些变量(传统上)用于保存您希望从一种用法保留到另一种用途的对象状态。

在方法中定义的局部变量就是 - local 变量。它是一个辅助变量,可以帮助您执行方法的功能,并且在方法调用结束后没有意义(也不存在)。

答案 3 :(得分:0)

最重要的差异是您的AnotherClass实例的生命周期。

Aclass.h

class Aclass{ 
private: 
    AnotherClass someobj1; //option 1: This instance is accessible from within the Aclass instance as long as the Aclass instance is not destroyed.
public:  
    void someMethod(); //option 1: So someobj1 is available (for reading AND writing in this method. When you call this method twice, you will work with the same instance each time.
    void someMethodToo(); //option 1: someobj1 will also be available in this method for reading AND writing.
};

Aclass.cpp

void Aclass::someMethod(){ 
    AnotherClass someobj2; //option 2: This instance is destroyed when someMethod is done. The method someMethodToo that I described above will never have access to someobj2 either. If you call someMethod twice, each will have it's own someobj2. 
}

答案 4 :(得分:0)

编程的绝对规则是在绝对必要时定义,声明或初始化。这意味着它显然会降低内存和性能的成本。
也就是说,当您在类中声明成员变量时,只要创建了新对象,就会为其分配内存空间。因此,除非您在每个对象中都需要它,否则不要在类范围内声明它 当您不希望任何函数或类有权访问此变量时,再次声明变量private是必要的。否则你应该公开宣布它 如果在函数范围中定义变量,则只有在调用函数时它才会占用内存,并在函数范围结束后立即删除。 总的来说,类的定义是它将与数据相关的数据和函数保存在一起。因此,当您定义一个类时,您应该记住该类中将包含哪些数据,然后声明将处理数据的函数。
该函数基本上是在该输入上获得一些输入和处理。最后返回一些必要的数据。如果需要为要完成的过程声明一些变量,那么只需声明变量。