开发者社区> 问答> 正文

为什么可以修改函数返回的const对象??报错

之前总是认为如果一个函数返回const对象,那么这个对象是不能修改的,但下面的代码的确让我费解

// Vector3.h
class Vector3
{
public:
    float x;
    float y;
    float z;

    // 构造函数
    .....

    const Vector3 operator+(const Vector3 &v)
    {
        return Vector3(x + v.x, y + v.y, z + v.z);
    }
}

// Source.cpp
Vector3 v0(1, 2, 3);
Vector3 v1(3, 4, 5);

Vector3 v3 = v0 + v1;
v3.x = 100;

return 0;

上面的 v3 应该是const 对象才是,不过程序中并没有报错,而且也可以修改里面的变量的值,不知道为什么。

展开
收起
爱吃鱼的程序员 2020-06-09 13:56:47 710 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    inta=1+2;

    1是常量(字面常量,可以称为“常量中的常量”),

    2也是,

    +操作符在语义上就是常量操作,返回值也是常量。

    但……人家a是变量!把一个常量赋值给一个变量,通常意义上就是将右值(可以是常量,也可能是变量)的值“复制”一份给左值(变量)。

    ============

    举个例子,小明有女朋友,很漂亮,五官标致,但这个女朋友是常量,动不得。小明的同桌二狗子依据小明女友的模子,找塑胶厂定制了一个你懂的,然后二狗子当然当然当然可以动这个你懂的。


    我忽然又有疑问了,函数声明中的返回类型不是对接受它的返回值的变量的类型的一种限制吗?既然这样为什么接受重载的+操作的返回值的变量的类型不能限制为constVector3呢?我明白了,这里改变的是复本的值。谢谢解惑!

    引用来自“石头左边”的评论

    inta=1+2;

    1是常量(字面常量,可以称为“常量中的常量”),

    2也是,

    +操作符在语义上就是常量操作,返回值也是常量。

    但……人家a是变量!把一个常量赋值给一个变量,通常意义上就是将右值(可以是常量,也可能是变量)的值“复制”一份给左值(变量)。

    ============

    举个例子,小明有女朋友,很漂亮,五官标致,但这个女朋友是常量,动不得。小明的同桌二狗子依据小明女友的模子,找塑胶厂定制了一个你懂的,然后二狗子当然当然当然可以动这个你懂的。


    引用来自“石头左边”的评论

    引用来自“石头左边”的评论

    inta=1+2;

    1是常量(字面常量,可以称为“常量中的常量”),

    2也是,

    +操作符在语义上就是常量操作,返回值也是常量。

    但……人家a是变量!把一个常量赋值给一个变量,通常意义上就是将右值(可以是常量,也可能是变量)的值“复制”一份给左值(变量)。

    ============

    举个例子,小明有女朋友,很漂亮,五官标致,但这个女朋友是常量,动不得。小明的同桌二狗子依据小明女友的模子,找塑胶厂定制了一个你懂的,然后二狗子当然当然当然可以动这个你懂的。


    @石头左边

    哪里才可以买到《白话c++》呢?之前看过<C++PrimerPlus>,不过我想通过您的书了解到更多程序执行的细节,我一直觉得这对写好C++程序很重要。

    北航出版社今年内会出。
    2020-06-09 13:57:04
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载