You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:45:41