×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

你会变魔术吗?

如果不会变魔术,就不要说“没有指针,反正也什么东西都能实现”

例如 我们有class animal;
class people:public class animal; (人是动物的一种)
class monkey:public class animal; (猴子也是动物的一种)

下面开始变魔术了,有一个魔术柜子叫magic:
magic(class animal ×) {}
我们放进一个美女:
class animal * m;
class people * p;
m = p;
magic(m);

结果打开箱子,再看看m,
m->getname() = monkey;
美女变成了猴子。

我们用了指针,其实魔术柜子里只是转变了指针的指向,美女还是美女,正在后台喝水呢。

如果你用了引用,注意,所谓引用总是指向初始化所指向的值。你改变了引用,对象本身同时被改变。如上面的魔术柜。
如你用引用来调用magic();
那么结果那个可爱的美女真的变成了一只猴子!!!
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / 个人认为,指针和引用是几乎一回事。只是在特定条件下,用某种类型方便一些。不知为何,领导强调一定要用引用?
    • 因为LD只会引用.
    • 概念上完全不一样,怎么会是几乎一回事?好久不写程序了,莫非世道变了?你LD看来是科班出身的。
    • 你领导是错的!有时只能用引用,有时只能用指针
      多加学习,详情查阅《More Effective C++》Item 1: Distinguish between pointers and references.
    • 如果传一个参数进去,用引用的话,你可以随便给这个参数赋值,等调用结束后,这个参数的值还是和调用前一样,中间那些赋值都是临时的。如果用指针的话,中间那些赋值就不是临时的了。参数size太大的话不适合用引用的方式传。
      • 答非所问.LZ is asking the difference between pointers and references. you are talking pass-by-value vs. pass-by-reference.
        • 噢,看错了。
      • NOoo
        • NOoo啥?传参数的讲法不对?不会吧。好,不讲传参数了。Java可以说都是引用,没有指针,反正也什么东西都能实现,而且简单不易错,挺好的。LD说C++等不让用指针也是有道理的。指针涉及分配空间,然后还得释放。忘了释放,或者
          把释放放在末尾,可是中间转走了,或者转去exception出来然后回不来了什么的,那就忘了释放了,结果内存就泄漏了。测还测不出来。吃过苦头的人,或者没准备好适用指针的人,可能会坚持使用引用。
          • 你会变魔术吗?
            如果不会变魔术,就不要说“没有指针,反正也什么东西都能实现”

            例如 我们有class animal;
            class people:public class animal; (人是动物的一种)
            class monkey:public class animal; (猴子也是动物的一种)

            下面开始变魔术了,有一个魔术柜子叫magic:
            magic(class animal ×) {}
            我们放进一个美女:
            class animal * m;
            class people * p;
            m = p;
            magic(m);

            结果打开箱子,再看看m,
            m->getname() = monkey;
            美女变成了猴子。

            我们用了指针,其实魔术柜子里只是转变了指针的指向,美女还是美女,正在后台喝水呢。

            如果你用了引用,注意,所谓引用总是指向初始化所指向的值。你改变了引用,对象本身同时被改变。如上面的魔术柜。
            如你用引用来调用magic();
            那么结果那个可爱的美女真的变成了一只猴子!!!
            • 哈哈哈哈哈哈哈哈哈,你编的?真好玩。
              可是俺还是想说呀!

              你不会找个空箱子把美女先藏里边,放她到后台喝水,然后再把猴子进美女的箱子去呀。
              • 既然是魔术,就是要别人看不出来啊,所以接口(至少是public的接口)只能有一个
                以上例子是我编的,意思是指针有引用无法替代的地方。

                以下摘自<More Effective C++>中译本,侯捷译:

                总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
          • references is not pass-by-value
          • 另外一个说法是,everything in JAVA is a pointer
            it depends on how u interpret it in JAVA
    • 领导的强调有一定的道理,估计其主要目的是为了避免空指针的使用.但在现实中,他的愿望十有八九要落空.
    • 能用reference就要用reference, 因为不易出错//reference must be initialized upon declaration, 如果做不到,就只好用pointer//不是所有的地方可以用pointer,比如operator overloading.
    • 我也喜欢用引用多一些,因为引用保证非空。所以很多时候不用担心空指针等情况出现。
    • A reference is a constant address, while a pointer is an address variable.
      A reference is a constant address.
      You can not assign a value to a reference, but you can change the value in the constant address.

      A pointer is an address variable.
      You can assign an address to it, so a pointer is null before you assign an address to it.
      If pointer is not null, you can change the value in the address that the pointer points to.
    • All about making the game fair.
      C++ give you a thing can refer to anywhere, that's pointer, also give you a thing can and only can refer to one place. That's reference.