如果我有类似
的课程class sample{
// ...
} obj;
上面创建的对象obj
的范围是什么?什么时候会毁坏这个物体?
答案 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所指出的,如果对象是在库中定义的,并且这个库是动态加载的,那么在卸载库时会破坏对象;这不一定是程序退出的时候。