一个“常成员函数”的问题:调用常成员函数会不会引发构造函数和析构函数的发生?

kakajenifer 2004-09-16 05:13:42
对象被创建会自动执行构造函数;当它生存期结束又会执行析构函数。
但是如果创建一个常对象的话,这个对象会不会去执行它的构造和析构函数呢?

例子如下。



#include <iostream>
using namespace std;

class R
{
public:
R(int r1,int r2){R1=r1;R2=r2;}
~R();
void print();
void print() const;
private:
int R1,R2;
};

void R::print()
{}

void R::print() const
{}

int main()
{

R a(5,4);
a.print();
const R b(20,52);
b.print();

/* */
system("pause");
return 0;
}
...全文
223 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjh1982 2004-09-17
  • 打赏
  • 举报
回复
就是这样的了
kakajenifer 2004-09-16
  • 打赏
  • 举报
回复
多谢各位!
多谢晨星 和 三井 !
bm1408 2004-09-16
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class R
{
public:
R(int r1,int r2)
{
R1=r1;
R2=r2;
cout<<"constructor"<<endl;
}
~R()
{
cout<<"destructor"<<endl;
}
void print();
void print() const;
private:
int R1,R2;
};

void R::print()
{
cout<<"no const print"<<endl;
}

void R::print() const
{
cout<<"const printf"<<endl;
}

int main()
{

R a(5,4);
a.print();
const R b(20,52);
b.print();



return 0;
}
看看输出结果!
whyglinux 2004-09-16
  • 打赏
  • 举报
回复
一个类对象在生成后调用构造函数、在销毁之前调用析构函数,这是C++的设计机制,是由编译系统保证实现的,不受对象是const对象还是非const对象的约束。不象类的其它非静态成员函数,构造函数和析构函数是一类特殊的函数,没有 const 和非 const 之分。
晨星 2004-09-16
  • 打赏
  • 举报
回复
关键问题是:大部分成员函数都是可能被调用,也可能不被调用的,但构造和析构不是,只要对象被产生,他们是必然被调用的。
晨星 2004-09-16
  • 打赏
  • 举报
回复
const的时效应该到析构之前终止,这是有道理的。
因为,析构函数负责该类的所有实例的析构动作,而不是仅负责那些非 常对象的析构动作。而且开发软件的时候,经常是类的定义者是一个人,使用者是另一个人,定义者根本不知道使用者是否会定义一个常对象,所以也就有可能在析构函数中写下他所想写的任何代码。

这样,如果一定要求常对象的析构动作不得调用任何修改操作,势必给语言、编译器和类的设计者都造成特别复杂的问题,甚至是不可能解决的问题。
kakajenifer 2004-09-16
  • 打赏
  • 举报
回复
goodboy1881 三井 大哥,能说的明白点吗??
不是很理解诶~~

偶只是觉得 析构函数里如果用了普通的数据成员,那const的东西可能会被改变,对吗?

另外,你们的意思 是不是说 不管是不是什么常对象,总之一定会调用构造和析构?

包括 比如我程序中这句const R b(20,52); ???
积木 2004-09-16
  • 打赏
  • 举报
回复
你所谓的常成员对象,不过是这成员里面的数据是不允许被修改的~
并不影响它的出生和消亡,所以是不会有什么问题的 看一个简单的例子


using namespace std;
class C
{
private:
int i;
public:
C(int i):i(0){ cout<<"Create a C\n"; };
C(){ cout<<"Create a C\n"; };
~C(){ cout<<"Destroy a C\n"; };
public:
void add(){ i++; };
};
int main()
{
const C c(1);
c.add();
return 0;
}

这段代码编译不过去的原因是因为c是一个const对象,而const是不允许被修改的~
kakajenifer 2004-09-16
  • 打赏
  • 举报
回复
我的理解应该是这样: 构造 --> const 产生 --> ......--> 析构 --> const被delete

所以,析构还是可能调用到?!
kakajenifer 2004-09-16
  • 打赏
  • 举报
回复
还是有点迷糊,说const在构造之后才进入“时效”可以理解,但是在析构之前,const怎么消失了呢?
到底这个系统的步骤是什么呀?

我的意思是:认为const应该在常对象被删除之后才消失,而析构是在删除前完成的动作。所以应该还是有点抵触………………


不解ing.............


请求大侠指点!
Squall1009 2004-09-16
  • 打赏
  • 举报
回复
是要调用滴,只要是类的对象

const应该只你构造好了以后不能改变其数据成员,
析构函数当然要调用。

就象你在{
const i=0;
......
}
i只在它自己的域内是可见的,并且不能改变,但到这个域结束的时候,也要释放i占的内存啊.
晨星 2004-09-16
  • 打赏
  • 举报
回复
同意楼上:“常”的时效范围就是在构造之后和析构之前。否则的话,如果不同从系统中删除,那还不内存泄漏了?
doolin 2004-09-16
  • 打赏
  • 举报
回复
const对象的构造函数和析构函数会自动被调用,并且构造函数和析构函数不需要用const修饰.
原因是:当一个对象建立以后(调用了构造函数),它的常量性才确立,在销毁之前(调用析构函数之前)常量性失效.
kakajenifer 2004-09-16
  • 打赏
  • 举报
回复
书上说:
1.常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。这保证了在常成员函数中绝对不会更新数据成员的值。
2.如果将一个对象说明为常对象(const对象),则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。这是C++从语法机制上对 const对象 的保护,也是 const对象 唯一的对外接口方式。

---------------------------

我现在怀疑的就是:如果构造和析构调用到了数据成员,那上述两条就不再成立,也就是说const的保护将失去效果啊?!
oo 2004-09-16
  • 打赏
  • 举报
回复
都会调用。
cpunion 2004-09-16
  • 打赏
  • 举报
回复
const R b(20,52);这个吗?

当然要调用了。
248406869 2004-09-16
  • 打赏
  • 举报
回复
"常对象"的概念是什么?我怎么从来都没听说过呀。

64,647

社区成员

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

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