找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 856|回复: 3

请叫一个关于自身类对象的指针的问题(新手)

[复制链接]
发表于 2009-11-4 00:31:50 | 显示全部楼层 |阅读模式 IP:江苏扬州
假如有某类a
class a
{
private:
int x;
a *p1;
a *p2;
........
..........
a(int i):x(i),p2(NULL){.....}
a():p1(this){}
void bb();
};

void a::bb()
{
p1->p2=new a(1);//第一次
p1->p2=new a(2);//第二次
p1->p2=new a(3);//第三次
}
int main()
{
a text;
text.bb();
......
......
}
p1->p2=new a;这个语句是否就是把NEW得的地址赋给p2?
现在p1的值不变,P2的值会随着每次NEW改变,另通过COUT输出p1->p2的值与P2一样变化的.
如果把bb()函数里的语句改动一下,在每一次NEW的后面加上p1=p1->p2;的语句,如下:
p1->p2=new a(1);//第一次
p1=p1->p2;
p1->p2=new a(2);//第二次
p1=p1->p2;
p1->p2=new a(3);//第三次
p1=p1->p2;
这时P2的值只在第一次NEW时由NULL变为第一次NEW时的地址,而后两次P2的值没有变动,
同时P1因为P1=P1->P2;语句会三次改变其值,而通过COUT输出P1->P2的值却始终为0;
不知道何故,该怎样理解P1->P2的含义,为什么会有上面这些情况的输出,希望高手帮我分析一下,
发表于 2009-11-4 00:31:51 | 显示全部楼层 IP:江苏扬州
问个问题啊。

你的第一个构造函数a(int i)给p1赋的初值是什么?第二个构造函数给x和p2初值又是什么?

这样写代码,不觉得内存泄漏的厉害么?
回复

使用道具 举报

发表于 2009-11-4 00:31:52 | 显示全部楼层 IP:江苏扬州
把指针指向的对象在纸上画出来,这个问题就不难理解了。

a text; //调用 a()构造函数,text.p1 指向对象text,text.p2没有初值。
text.bb()
{
p1->p2 = new a(1); //相当于text.p2 = new a(1);这时text.p2肯定有值。
p1 = p1->p2; // 这里把p1指向了new a(1)所得的对象,姑且称之为a1。 new a(1)调用构造函数a(int i),其中p2= NULL。 如果这时打印p1->p2的值,就是a1.p2 ,也就是NULL。所以你会看到p1->p2的值始终是0。
}

明白了么?还有不明白的继续问不过告诫楼主,要养成良好的编码习惯。
回复

使用道具 举报

发表于 2009-11-4 00:31:54 | 显示全部楼层 IP:江苏扬州
非常感谢柳儿的回复,我终于明白了,我上面的代码是我所举的例子,也就没考虑代码的完整和性能了,
感谢柳儿告戒,我会慢慢养成良好的编码习惯的。
本来看下觉得还有疑问想再问,豁然想到在NEW时,在不同的实例中存在不同几个P1,P2指针,我一直想不通
的就是只有那两个指针,为何会有这些变化。原来已是此指针非彼指针了啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 21:35 , Processed in 0.126505 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表