100提几个问题

eg446yzk 2008-01-06 11:28:41
家里的机器不能上2网,搜集了一个星期的问题到网吧来问各位拉!!!
1.在下列类中 输出结果为什么是这个样子的?
#include <iostream>
using namespace std;

class Monitor{
public:
static int count;
public:
void incident()
{
++count;
}
void decrement()
{
--count;
}
void print()
{
cout<<Monitor::count<<endl;
}
};
//-------------------
class Monitor2{
void *d;
public:
Monitor2(Monitor *p)
{
d=p;
Monitor *s;
s=reinterpret_cast<Monitor *>(d);
s->incident();
s->print();
cout<<"Monitor2"<<endl;
}
~Monitor2()
{
cout<<"~Monitor2"<<endl;
reinterpret_cast<Monitor *>(d)->decrement();
reinterpret_cast<Monitor *>(d)->print();
}
};
int Monitor::count=0;

void sdf()
{
Monitor m;
Monitor2 pp(&m);
}
Monitor m1;
Monitor2 pp1(&m1);

int main()
{
sdf();
}
这个函数定义了两次对象但是只调用了一次析构函数.
但是如果把那个全局定义的对象改成局部对象,那么就能正常析构这个对象.?????
在C++全局类对象是不是不调用析构函数的 ???
//----------------------------------------------------------------------------
...全文
249 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yb__537 2008-01-07
  • 打赏
  • 举报
回复
1.vs2005运行没问题,Monitor2两次析构。至于vc6.0,扔了吧
2.A A::s;和A A::s();不一样,第一个是声明一个static变量,必须的,(好像vs2005里面不用也可以);第二个是一个函数声明,返回类型是A,参数是空。


因为A s;就相当于 A s();
-------------------------------------------------------
我来说下这个吧,当类的构造函数没有形参时,定义的对象不能带()。
lockhall 2008-01-06
  • 打赏
  • 举报
回复
第一个问题。

如果用vc6.0的话,建议换个编译器测试下。应该是肯定会调用析构函数的。当然在生命周期结束时。

在DEVCPP VS2005下看看吧。
ryfdizuo 2008-01-06
  • 打赏
  • 举报
回复
问题二你是将构造函数私有化了啊,你可以参考一下singlton模式,
ryfdizuo 2008-01-06
  • 打赏
  • 举报
回复
全局变量是在退出main函数以后析构的啊

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

Test b;
int main()
{
Test a;

return 0;
}
eg446yzk 2008-01-06
  • 打赏
  • 举报
回复
5楼的我用的是VC6.0
编译的时候就是出现这种情况外部对象的析构函数不调用了
不知道是不是VC编译器的问题/

对于第2个问题,在定义非静态类的时候能够通过运行
因为A s;就相当于 A s();
Cantaloupe77 2008-01-06
  • 打赏
  • 举报
回复
第一个问题试了一下,调用了两次析构,不知道是不是你的编译器问题.
我用的是VS2005
Cantaloupe77 2008-01-06
  • 打赏
  • 举报
回复
第二个问题,发表一下我的拙见
s是一个静态成员变量,而不是一个函数,s()为函数的调用,当然不行.
你见过一个在类中定义一个static int a;而这样定义么 A::a()?
longfei_007 2008-01-06
  • 打赏
  • 举报
回复
对于一个类只可以生成一个对象的具体方法.建议看下设计模式中的单例模式,如果手头上没有设计模式的书籍.可以查看下More Effective C++


自己看来的东西可能更能记得
eg446yzk 2008-01-06
  • 打赏
  • 举报
回复
3个问题在线等。。答了就给分
eg446yzk 2008-01-06
  • 打赏
  • 举报
回复
3。在C++中如果有多个.cpp文件如何修改连接器的连接顺序?

eg446yzk 2008-01-06
  • 打赏
  • 举报
回复
再来个问题/
2. //当前类的 作用是只能通过类的指针使用这个类,且只有一个实例
class A{
A(){
};
A(const A &)
{

}
static A s;
public:
static A *m()
{
return &s;
}
};
A A::s; //这里为什么不能是 A A::s();错误原因是s不是一个函数?
int main()
{
A *a=A::m();
}
//-------------------------------------------------
stherix 2008-01-06
  • 打赏
  • 举报
回复
VC6下
全局对象的析构函数的屏幕输出是会被忽略的
ltc_mouse 2008-01-06
  • 打赏
  • 举报
回复
第一题可以看到的输出有全局变量的构造,但看不到全局变量的析构;前面各位已经说了,这与全局变量的作用域有关;可以理解成这是在main结束后(结束时)才做的析构;到cmd里去执行生成的exe文件,应该就能看到(我用Dev C++验证是这样的)。
rularys 2008-01-06
  • 打赏
  • 举报
回复
应该是为了避免函数与变量的混淆吧,所以不能这样调用默认构造函数
rularys 2008-01-06
  • 打赏
  • 举报
回复
第二个问题我也解释不清;
你可以试试这个:
class A{
A(int i=0){
};
A(const A &)
{

}
static A s;
public:
static A *m()
{
return &s;
}
};
A A::s(0);
int main()
{
A *a=A::m();
}
hastings 2008-01-06
  • 打赏
  • 举报
回复
问题一:因为全局变量是在退出main函数以后析构的,
所以vc6中,在控制台上你看不到全局变量的析构。
如果把这些语句输入到文件中就能看到了。
#include<iostream>
#include<fstream>
using std::cin;
using std::cout;
using std::endl;
using std::ofstream;
class Monitor
{
public:
static int count;
static ofstream m_os;
public:
void incident()
{
++count;
}
void decrement()
{
--count;
}
void print()
{
if(m_os)
m_os<<Monitor::count <<endl;
}
};
int Monitor::count=0;
ofstream Monitor::m_os("D:\\01.txt",std::ios::app);
//-------------------
class Monitor2
{
void *d;
static ofstream m_os;
public:
Monitor2(Monitor *p)
{
d=p;
Monitor *s;
s=reinterpret_cast <Monitor *> (d);
s->incident();
s->print();
if(m_os)
m_os<<"Monitor2"<<endl;
}
~Monitor2()
{
if(m_os)
m_os<<"~Monitor2" <<endl;
reinterpret_cast <Monitor *> (d)->decrement();
reinterpret_cast <Monitor *> (d)->print();
}
};
ofstream Monitor2::m_os("D:\\02.txt",std::ios::app);
Monitor m1;
Monitor2 pp1(&m1);
int main()
{
return 0;
}

问题二:
A A::s;//本身就会调用A(){}
再比较如下情况:
class   A
{
A(int){}
A(const A &){}
static A s;
public:
static A* m()
{
return &s;
}
};
A A::s(3);
int main()
{
A *a=A::m();
return 0;
}
ttkk_2007 2008-01-06
  • 打赏
  • 举报
回复
1.vs2005运行没问题,Monitor2两次析构。至于vc6.0,扔了吧
2.A A::s;和A A::s();不一样,第一个是声明一个static变量,必须的,(好像vs2005里面不用也可以);第二个是一个函数声明,返回类型是A,参数是空。


因为A s;就相当于 A s();
==============================
这两个可不一样,第一个就是定义一个变量s,类型是A,第二个是一个函数声明,返回类型是A,参数为空。
rularys 2008-01-06
  • 打赏
  • 举报
回复
问题3,没有必要的设置,所以IDE没有提供。项目建间的依赖顺序或者链接顺序倒是有,而且可以设置
rularys 2008-01-06
  • 打赏
  • 举报
回复
拆构肯定是被调用了的,只是调用的时机不一样,然后就没有输出;你可以试试不用控制台输出应该就能测试到
chao_83 2008-01-06
  • 打赏
  • 举报
回复
问题2:
你看下面几行:
int a; // 变量定义;
int f();// 函数声明;没参数;
int b(3);// 变量定义,括号里面是参数;
int F(int);//函数声明,括号里面是类型。

对于自定义的class,()可以是默认构造函数;不过,
在全局作用域加只用()还是理解为函数好,要不然怎么定义函数呢?
你看是不是这样理解。
加载更多回复(2)

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧