C ++ - 在类定义结束时创建的对象的范围

时间:2016-07-21 04:00:15

标签: c++ class object scope

如果我有类似

的课程
class sample{
  // ...
} obj;

上面创建的对象obj的范围是什么?什么时候会毁坏这个物体?

3 个答案:

答案 0 :(得分:6)

obj的范围与类定义的范围相同。如果在所有函数之外定义它,它的范围将是全局的,它将在静态初始化时创建和初始化,并在程序终止时被销毁。

但是,也可以在函数中定义这样的对象。在这种情况下,它将在函数输入时创建,并在函数返回时销毁。

void test()
{
   class sample{ }obj;
}

是完全有效的代码。

您还可以将其定义为类中的嵌套类型。在这种情况下,obj将是该类的成员变量。它将通过构造和销毁包含类的对象来创建和销毁。

struct Foo
{
   class sample{ }obj;
};

另外(感谢@sjdalessandro将其指出),如果在库中使用全局作用域定义对象并且动态加载此库,则在加载库时创建对象(不一定当程序启动时)并在卸载库时被销毁(这不一定是程序退出时)。

答案 1 :(得分:2)

它将具有上述范围声明的范围。 Try it.

示例:

 if($this->request->is('post'))
        {
            if(isset($this->data['Loginsubmit']))
            {

             if($this->data['Reg']['email']=='')
                {
                    echo 'hii'; 
                }
                elseif( $this->data['Reg']['password']=='')
                {
                      echo "hi";
                }
                else
                {
                   $result = $this->Reg->find('list',array('conditions'=>array('email'=>$this->request->data['Reg']['email'], 'password'=>$this->request->data['Reg']['password'],'status'=>1)));
                pr($result);
                 if(!empty($result)){
                    $email=$this->request->data['Reg']['email'];
                    $this->Session->write('Reg', $result);
                       $this->redirect(array('action' => 'login'));}               
         else{$this->Flash->error("invalid");
                }
                 $result = $this->Reg->find('all');
                $this->set('results',$result);
               }

答案 2 :(得分:1)

如果在全局范围内定义类,它将具有全局范围。在这种情况下,对象obj将在应用程序启动期间初始化,并将在应用程序退出期间销毁。否则,范围将限于实际定义类的位置。

很容易观察到这种行为。请参阅以下示例全局类的定义。

class sample
{
public:
    sample()
    {

    }   
    ~sample()
    {
    }
}Obj;

在构造函数和析构函数中放置一个断点,并查看两者都被调用的点。在应用程序启动期间,您可以在调用构造函数时观察调用堆栈,如下面给出的那样。

App.exe!sample::sample() Line 582   C++
App.exe!`dynamic initializer for 'Obj''() Line 589  C++
msvcr110d.dll!_initterm(void (void) * * pfbegin, void (void) * * pfend) Line 889    C
App.exe!__tmainCRTStartup() Line 460    C
App.exe!wmainCRTStartup() Line 377  C

从上面的调用堆栈中可以看出,类sample的构造函数是在应用程序启动期间发生的C ++运行时库初始化的一部分中调用的。对于类Destructor也是如此,即它将在应用程序退出期间调用。

正如@sjdalessandro所指出的,如果对象是在中定义的,并且这个库是动态加载的,那么在卸载库时会破坏对象;这不一定是程序退出的时候。