C++中自定义复杂类型与原生数组的assignment operator行为差异
问题:为何类内数组能赋值,原生数组直接赋值却不行?
你会发现BoVector对象可以通过a = square(bv);完成所有元素的赋值,但原生数组直接赋值却行不通,比如:
int b[2]{ 1,2,3 }; int c[2]{ 3,4,5 }; c = b; // 编译报错
c = b;会触发编译错误,这是为什么?因为原生数组没有重载赋值运算符来支持数组间的直接赋值。
备注:不要在评论区问我应该用什么或不该用什么(这就像让我删掉问题忘了它!)。我的问题很明确:为什么类内部的数组能实现赋值,而原生数组的常规赋值却无法生效?
相关代码
template <typename T> T square(T x) { return x * x; } template<typename T> class BoVector { private: T arr[1000]; size_t size; public: BoVector(): size(0) {} void push(T x) { this->arr[this->size] = x; ++(this->size); } T get(int i) const { return arr[i]; } size_t getSize() const { return this->size; }; void print() const { for (size_t i=0;i<size;++i ) { std::cout << this->arr[i] << '\n'; } } }; template<typename T> BoVector<T> operator*(const BoVector<T>& rhs1, const BoVector<T>& rhs2 ) { BoVector<T> result; for (size_t i = 0; i < rhs1.getSize(); ++i) { result.push(rhs1.get(i) * rhs2.get(i)); } return result; } int main() { BoVector<int> bv; bv.push(2); bv.push(10); bv.push(3); bv.push(20); BoVector<int> a; a = square(bv); // 完全正常运行 a.print(); int b[2]{ 1,2,3 }; int c[2]{ 3,4,5 }; c = b; // 无法运行 }
原因解析
- 原生数组的特性限制:在C++里,原生数组名在多数场景下会被自动转换成指向首元素的指针。当你写
c = b;时,本质是尝试把b转换后的指针赋值给c,但数组名是不可修改的左值(相当于固定的内存地址标识),不允许被赋值,因此直接触发编译错误。 - 类对象的赋值逻辑:
BoVector类虽然内部包含数组,但类对象的赋值调用的是编译器自动生成的默认赋值运算符。这个运算符会执行逐成员复制——把源对象的arr数组每个元素复制到目标对象的arr中,同时复制size成员。这不是数组之间的直接赋值,而是类对象整体的成员复制操作,所以能正常完成赋值。
简单总结:类对象赋值是复制整个对象的所有成员(包括内部数组的每一个元素),而原生数组本身不支持直接赋值,因为数组名不是可被赋值的变量。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

