输入运算符重载函数接收const Vector引用为何可行?
问题解答
这段代码能运行纯属侥幸,本质是未定义行为,只是你当前测试环境没触发崩溃或异常而已,写法本身完全错误。
关键问题点:
const Vector& A的作用是向编译器承诺:不会修改这个Vector对象的任何成员。但你的代码里却通过A.data[i]直接修改了Vector内部数组的元素,这已经违反了const的约定。- 之所以能编译通过且暂时运行正常,是因为你的Vector类中
data是普通指针(非const)。const修饰的是Vector对象本身,只会限制你修改对象的直接成员(比如size),不会自动把指针指向的内存也变成const。编译器没法检测这种间接修改,所以放过了这段代码,但运行时属于非法修改const对象的内容,后续随时可能出现崩溃、数据错乱等问题。
正确的写法:
必须把第二个参数改成非const引用,明确表示要修改这个Vector对象:
istream& operator>> (istream& in, Vector& A) { for (int i = 0; i < A.size; i++) in >> A.data[i]; return in; }
额外说明:
如果你的Vector类里data被定义为const T*类型,编译器会直接报错,阻止你修改指针指向的内容。但普通指针的情况下,编译器的const检查不会递归到指针指向的内存,才导致了这种“看起来正常”的错误场景。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

