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

C++深拷贝实现报错:invalid conversion from 'int' to 'int*' [-fpermissive]

问题分析与解决

错误原因

编译错误invalid conversion from 'int' to 'int*'的核心问题是:类成员deep是int类型指针,而你在普通构造函数里直接把int值c赋值给它,这属于类型不兼容——指针需要存储内存地址,而非原始数值。你尝试的强制类型转换(int)c只是把c转成int,本质还是给指针赋值数值,完全没解决问题。

修正方案

需要在普通构造函数中用new在堆上分配内存,把c的值存入这块内存,再让deep指向该地址。另外还要修正拷贝构造函数的参数为const引用(符合C++规范,也能接收const对象),同时建议补充赋值运算符重载避免潜在的浅拷贝问题。

修正后的完整代码

#include <iostream>
class Simple {
private:
    int data_one, data_two;
    int *deep;

public:
    // 普通构造函数:在堆上分配内存并初始化值
    Simple(int a, int b, int c) : data_one(a), data_two(b) {
        deep = new int(c);
    }

    // 拷贝构造函数:深拷贝堆内存数据,参数改为const引用
    Simple(const Simple &dummy) : data_one(dummy.data_one), data_two(dummy.data_two) {
        deep = new int(*(dummy.deep));
    }

    // 补充赋值运算符重载(避免赋值操作时的浅拷贝问题)
    Simple& operator=(const Simple &other) {
        if (this != &other) { // 防止自赋值导致的内存泄漏
            data_one = other.data_one;
            data_two = other.data_two;
            // 先释放当前对象的堆内存,再分配新内存拷贝值
            delete deep;
            deep = new int(*(other.deep));
        }
        return *this;
    }

    ~Simple() {
        delete deep;
    }

    void Display() {
        std::cout << data_one << ", " << data_two << ", " << *deep << "\n";
    }
};

int main() {
    int one = 3; int two = 4; int three = 5;
    Simple obj1(one, two, three);
    Simple obj2 = obj1;
    obj1.Display();
    obj2.Display();
}

关键修改点

  • 普通构造函数:将deep = int(c);改为deep = new int(c);,通过new在堆上创建int对象并初始化值为c,返回的内存地址赋值给deep指针,解决类型不匹配问题。
  • 拷贝构造函数:参数从Simple &dummy改为const Simple &dummy,符合C++拷贝构造函数的标准写法,允许拷贝const修饰的对象。
  • 补充赋值运算符重载:如果后续代码中出现obj2 = obj1;这类赋值操作,默认的赋值运算符会执行浅拷贝,导致两个对象的deep指向同一块堆内存,最终触发重复释放的错误。补充重载后可以避免该问题。

内容的提问来源于stack exchange,提问作者Oatman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:04