2 ssfxtrleaf ssfxtrleaf 于 2016.02.10 15:36 提问

c++ static 类实例 是否调用折构函数?
c++

比如说static MyClass myclass;
myclass的折构函数会不会被调用?

5个回答

caozhy
caozhy   Ds   Rxr 2016.02.10 21:11

会调用,但是可能不会再控制台输出

在VC++中编写如下代码:

 #include <iostream>
using namespace std;

class A
{
public:
    ~A() { cout << "~A" << endl; }
};

static A a;

int main(int argc, char* argv[])
{
    return 0;
}

在 ~A() { cout << "~A" << endl; }上点右键,选择添加断点

按f5或者“开始调试”。

程序会停在这一行。说明它的确是执行了的。但是此时控制台已经销毁,所以没有输出。

caozhy
caozhy 回复ysuwood: 的确是
2 年多之前 回复
qq_27183003
qq_27183003 单步运行,控制台有输出的。把~A() { cout << "~A" << endl; }分成多行再单步运行,就计较容易看到。
2 年多之前 回复
qq_27183003
qq_27183003   Ds   Rxr 2016.02.11 09:07

static用在类对象前面和用在普通变量前的作用是一样的。
static有两种用途,可参考:
http://blog.csdn.net/qq_27183003/article/details/49886843
析构函数会被调用。

 #include <iostream>
using namespace std;

class A
{
public:
    A(){ cout<<"A"<<endl; }
    ~A() { cout << "~A" << endl; }
};


void fun()
{
    static A a;

}
int main(int argc, char* argv[])
{
    fun();
    fun();
    fun();
    return 0;
}

caozhy
caozhy
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.10 21:12

图片说明

注意看红色圆圈中的黄色箭头。

NK_test
NK_test   Rxr 2016.02.15 19:51

会的,离开作用域就会调用

91program
91program   Ds   Rxr 2016.02.10 16:32

静态变量的作用域是整个程序的生存时间,所以就算调用类的析构函数,也是在应用退出时。
你可以增加 LOG 看看在程序退出时,类的析构函数会不会被调用:即有没有增加的 LOG 输出。应该是有的。

ssfxtrleaf
ssfxtrleaf 没有啊。。。难道不会被调用吗?。。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
类的构造函数和析构函数的调用顺序(一)
先贴一段代码:#include "stdafx.h" #include <iostream> using namespace std; class Class1 { public: Class1() :_index(0) { cout << "Create" << endl; } Class1(int index) :_index(index)
关于C++中构析函数的波浪号
在网上看到的C++析构函数就是波浪键加类构造函数。~键即键盘上的shift+~键。具体是上波浪还是中波浪可能因文本编辑器的不同而导致打出来的显示效果不同。比如1. Visual Studio 2015中波浪线显示为上波浪线2. VC6.0 中波浪线显示为上波浪线3. Notepad++中波浪线显示为中波浪线虽然显示方式有所不同,但都是正确的。...
C语言中static 函数除了不能再外部被调用外和普通函数还有什么区别呢?
C程序一直由下列部分组成:       1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。       4)栈——增长方向:自顶向下增长;自动变量以
通过函数指针调用static
 所谓函数指针就是一个指向函数的指针,也就是说我们定义一个函数指针量后,这个变量所在的空间要保存一个函数的地址。那么函数指针除了作为回调函数的传参之外还有什么作用呢?这里我们就结合staitc的作用来探讨一下函数指针是如何作为间谍的。 首先讨论一下static的作用,static从本质来讲就两个作用: 第一、 限定存储域:被static修饰的变量无论是局部变量还是全局变量都将被编译器存放
探秘static——类不需实例化就能用?
人是一个非静态类。人有脑子,这是一个用static修饰的属性。 这个属性是针对所有的人,是人的共同特征。而不是某个特点对象所特有的(比如张三有脑子,李四没脑子),因为只要是个人,他都有脑子(虽然卡洛斯·罗德里格兹只有半个脑子,还有些人比较脑残→_→,那也算是有脑子),既然是人类共有的,那么他就不能被实例化。
复制构造函数和析构函数经典例子
#include using namespace std; class A { public: A() { cout<<"this is construction"<<endl; } virtual ~A() { cout<<"this is destruction"<<endl; } }; A fun() { A a; return a; } int main() {
C/C++_static函数与普通函数
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不
构造函数与折构函数调用顺序
构造函数先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。 2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。 3.
类实例化对象可以访问静态(static)方法,但是不能访问静态属性。
总结: 类》访问->静态方法(类的方法)->可以 类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法) 对象》访问》静态方法(类的方法)->可以 对象》访问》普通方法(对象的方法)->可以该函数注释说可以 支持调用类的静态方法,从源码表面看,按理说类实例是不能调用类的静态方法。可是呢,PHP偏偏就支持 类实例化对象可以访问静态(static
c++ 析构函数
C++析构函数