V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fetich
V2EX  ›  问与答

这段《C++ Primer》的话如何理解?

  •  
  •   fetich · 2015-01-16 00:05:18 +08:00 · 2580 次点击
    这是一个创建于 3412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    "The distinction between top-level and low level matters when we copy an object. When we copy an object, top-level consts are ignored.
    Copying an object doesn't change the copied object. As a result, it is immaterial whether the object copied from or copied into is const."

    主要是最后的 the object copied into is const 无法理解,比如A值复制给B,B如果是const类型,怎么进行赋值(原文说 immaterial,无关紧要?)

    不知是不是我理解错了,因为我看勘误表也没有提到。(如果V友购买了中文版,能发一封2.4.3截图到[email protected],那是极好的了,感谢)

    附上截图:
    http://rghost.net/60366501/image.png

    最后感谢大家解答。

    13 条回复    2015-01-16 20:23:32 +08:00
    tsui
        1
    tsui  
       2015-01-16 00:12:13 +08:00
    it is immaterial whether (the object copied from) or (copied into) is const."



    这书还有中文翻译版的么?
    acros
        2
    acros  
       2015-01-16 00:28:08 +08:00
    这个const用法在英文术语里面是叫“top-level”"low-level"?

    就是修饰对象的区别,一个const修饰指针(top-level),一个修饰指针指向的对象(low-level)。
    如果是low-level,指针本身在复制时当然是const无关的。


    这本是第五版吧,翻了下第四版没这个内容·····
    acros
        3
    acros  
       2015-01-16 00:36:51 +08:00
    噗,说错了。
    仔细看了下文章,最后一句的意思是:
    复制时不会被赋值对象的值,有无const当然是没影响的····
    fetich
        4
    fetich  
    OP
       2015-01-16 00:38:23 +08:00
    @acros
    的确是第五版的内容。比如 const int i 这个 const 也是top-level。
    fetich
        5
    fetich  
    OP
       2015-01-16 00:39:38 +08:00
    @tsui
    加了括号还是不能理解。。。
    acros
        6
    acros  
       2015-01-16 00:42:07 +08:00
    x,打字老打反,“复制”和“赋值”搅浑了···请无视上面。


    1.书上最后一句意思: copy时不会改变被copy对象的值,有无const当然是没影响的····


    2.针对你说的:

    “主要是最后的 the object copied into is const 无法理解,比如A值复制给B,B如果是const类型,怎么进行赋值(原文说 immaterial,无关紧要?)”

    一个const对象是初始化以后不再能被改变,初始化赋值是允许的(类内const变量也是,可以在初始化列表中指定)。 而且非const类型可以隐式转化成const类型,反过来就要用到C++的类型转换方法了,书后面也会讲····
    fetich
        7
    fetich  
    OP
       2015-01-16 00:44:04 +08:00
    @acros
    被复制的对象 值不会改变,有无const没有关系,但被赋值的对象 如果是const类型,他的值初始化后不能被改变的啊。
    fetich
        8
    fetich  
    OP
       2015-01-16 00:47:08 +08:00
    @acros
    啊啊,这么晚了,感谢回复,明天我仔细看看。;-)
    acros
        9
    acros  
       2015-01-16 00:49:46 +08:00
    @fetich 对的。
    const是给编译器检查用的,“=”符号含义就是拷贝一份对象出来,不会涉及到改变对象的值,检查被拷贝对象的const属性是多余的····
    canautumn
        10
    canautumn  
       2015-01-16 01:01:57 +08:00   ❤️ 1
    其实这句话是这样解读的,Copying an object doesn't change the copied object. As a result, it is immaterial whether the object copied from or copied into is const.

    这里边的object 指的是正在复制的对象,比如以下两个例子,调换2、3行的const都正确。
    const int c2 = 42;
    const int c3 = c2;
    int c4 = c3;
    这里边的object指的是c3. (指最后一行的复制)
    const int ci = 42;
    const int * const p1 = &ci;
    const int * p2 = p1;
    这里边的object指的是p1。(指最后一行的复制)
    以上两个例子都是toplevel const 复制到toplevel non-const的例子,都正确,因为toplevel被忽略,可以从const复制到non-const,反过来当然也可以。

    直接翻译这句话:“复制一个对象并不能改变被复制的对象的值,所以,被复制的对象和复制到的对象是不是const无关紧要。” 对应以上的例子1: 复制c3 不会改变c3的值,所以c3和c4 各自是不是const无所谓。对应例子2:复制p1不会改变p1的值,所以p1和p2 各自是不是(注意)”Toplevel“ const 无所谓。

    这段话整个在讲的是toplevel const,这段儿还没讲到low-level的事儿,下段才是。

    这句话确实有点晦涩。不过你要清楚指针在这本书里也叫做object就知道了。
    acros
        11
    acros  
       2015-01-16 01:39:01 +08:00   ❤️ 1
    我发现我要被打脸了,怎么感觉说错了作者要表达的意思。

    top level是C++11里面新出来的术语吧·····
    看这篇的“顶级 const”:
    http://www.ilanever.com/article/sitedetail.html?id=221#article-navi-7


    看上面那篇C++11的解析吧,不要看我的了。
    fetich
        12
    fetich  
    OP
       2015-01-16 20:22:57 +08:00
    @canautumn
    下午仔细看了几篇,可能我抓错终点了。作者强调的是赋值两者的一致性,感谢你的回复。
    fetich
        13
    fetich  
    OP
       2015-01-16 20:23:32 +08:00
    @acros
    看起来像原文的翻译版。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:05 · PVG 00:05 · LAX 09:05 · JFK 12:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.