各位大大看过来【求解】一个非常有趣的关于C++与构造函数的问题!!

tiger_sg 2006-04-29 08:19:40
昨天晚上突发奇想,写了下列一个函数,请大家看看到底是为什么?

呵呵,百思不得其解!!谢谢!!
...全文
370 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
liang_liang 2006-05-01
  • 打赏
  • 举报
回复
你的构造函数如下
time::time(int tptr,int hr,int min,int sec)
{
cout<<"constructor--before assignment:"<<&tptr<<endl;
tmptr=&tptr;
cout<<"constructor--after assignment:"<<tmptr<<endl;
settime(hr,min,sec);
}
其中&是取地址!tmptr=&tptr;再一次取地址,所以输出结果一样!ntptr是指针,它有它固定的地址!它是指向一个变化的int型变量.所以ntptr的地址不会改变!改变变量的值时候,变量的值相应的改变!但是变量的地址不会改变!
wyj_215 2006-04-30
  • 打赏
  • 举报
回复
反汇编一下看看呢?我没时间
tyc611 2006-04-29
  • 打赏
  • 举报
回复
按常理推断是不可能有结果的,应该是编译器的特别处理,但对于C++的编译器还从没见过这种的,只在编译原理课里见过这东东了.再说,程序也不能这么写,没必要深究了
sharpdew 2006-04-29
  • 打赏
  • 举报
回复
呵呵,让我看看
tyc611 2006-04-29
  • 打赏
  • 举报
回复
关注~~~
逸学堂 2006-04-29
  • 打赏
  • 举报
回复
你想是永远想不同的。
看看你的编译器说明文档是如何处理的,就知道了。
不要瞎想,还想的挺痛苦。
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
求助啊!!!

大家帮帮忙,这问题好讨厌,怎么想都想不明白!
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
拜托,yuanchuang(元创),
你去测试下redhat linux测试下就知道结果咯!

我是真的很想知道答案,要不然就不会给100分来求解啦!!!

呵呵,你看我那个回复是开玩笑的口气,可我说的是真心话啊~不仔细研究,怎么能慢慢积累成为高手呢?
yuanchuang 2006-04-29
  • 打赏
  • 举报
回复
tiger_sg(Gordon) ( ) 信誉:100 2006-04-29 09:52:00 得分: 0


大家都好好想想啊~呵呵,我头发都想地白了好几根!!

不好好想想,怎么成高手啊!!!嘎嘎~~~
------------------
是不是在耍我们啊?如果不是的话,我就复制下来测试了……毕竟100分呢!
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
大家都好好想想啊~呵呵,我头发都想地白了好几根!!

不好好想想,怎么成高手啊!!!嘎嘎~~~
yuanchuang 2006-04-29
  • 打赏
  • 举报
回复
想不通,如果说做了const类似的处理的话。应该是不到内存中去取值,好像和这里不合啊,一人之见。

真想不通。还是等高手来回答吧……
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
to ugg(逸学堂(exuetang.net)) :

呵呵,最初我也是用VS来编译程序的,可是不行(VS编译器太死,如果一个指针指向局部变量,当函数退出时,会自动把指针初始化啦!!),出现你给出的结果..

我后来用redhat linxu + g++来编译运行,就不会有上述情况.
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
to limaolinghu(狸猫灵壶) :

不是啦!!你研究下程序里所打印出的地址(值),
我构造函数工作如下:
1. 把实参 nt 传到构造函数的虚参 tPtr (是一个int变量,不是指针,因为前后改过好几次程序,所以没去改变量名,呵呵),此属于pass-by-value - 通过两个变量地址不同可以判断.

2. 用构造函数虚参 tPtr的内存地址初始化 tmPtr (类变量)
逸学堂 2006-04-29
  • 打赏
  • 举报
回复
可能是编译器对int tPtr做类似const处理了。
Time::Time( int tPtr, int hr, int min, int sec )

所以造成变量是两个值,但是地址是一个。所以lz具体了解这种机制,看看通过反汇编来分析。
而我在VC下测试结果如下
Constructor - before assignment: 0012FDA8
Constructor - after assignment: 0012FDA8
Class Nothing: 0012FEBC
Class Nothing value: 90
Class Time value: -858993460
Class Time: 0012FDA8
Class Nothing: 0012FEBC
Class Nothing value: 900
Class Time value: -858993460
Class Time: 0012FDA8
Class Nothing: 0012FEBC
Class Nothing value: 9000
Class Time value: -858993460
Class Time: 0012FDA8
请按任意键继续. . .

并且
std::cout << "Constructor - before assignment: " << &tPtr << std::endl;
tmPtr = &tPtr;
~~~~~~~~
这时的tPtr是一个局部对象,当离开构造函数时,这个对象也随之销毁。所以会造成上面
的值的错误。
std::cout << "Constructor - after assignment: " << tmPtr << std::endl;
setTime( hr, min, sec );
北极猩猩 2006-04-29
  • 打赏
  • 举报
回复
Time tt( nt );
====================================================
Time::Time( int tPtr, int hr, int min, int sec )

nt和tPtrk在内存中可不是同一个变量哦,记住C++是采用传值而不是传指针
yuanchuang 2006-04-29
  • 打赏
  • 举报
回复
正在想,也实在没有想明白……那再想想
limaolinghu 2006-04-29
  • 打赏
  • 举报
回复
你传进来的是一个值,然后用这个值初始化指针,那么这个指针就指向这个值,所以值变了,对指针的间接引用也会变。
tiger_sg 2006-04-29
  • 打赏
  • 举报
回复
在main函数里:
1. 声明并初始化了int变量 nt ;
2. 构造类Time的一个变量(使用nt),在Time类tt对象的构造函数内部,tmPtr最终指不是指向 nt, 而是它的一个副本.

那为何,后来我变动了nt的值,tmPtr指向的内存地址(明明不是变量nt的地址)所对应的值也会发生相应改变呢??

此点怎么都没想清楚!请帮解答,谢谢!
limaolinghu 2006-04-29
  • 打赏
  • 举报
回复
yuanchuang(元创) ( ) 信誉:86 2006-04-29 09:04:00 得分: 0

int* ntPtr = &nt;
你用的是引用


不是把,是取址吧。
limaolinghu 2006-04-29
  • 打赏
  • 举报
回复
可以看看虽然main里的局部变量nt的地址和类Time里的变量指针tmPtr不一样?
为什么会一样,类Time里面的是nt的副本。

值会相应改变!!
当然会变,否则传他做什么。
加载更多回复(11)

64,685

社区成员

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

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