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

C++中如何确保const对象的裸指针指向数据不被修改?

解决方案

使用区分const/非const的Getter函数

给类添加两个版本的字符串获取方法,分别适配const和非const对象:

class Mystring{
 private:
    char* str;

 public:
    // const对象调用此版本,返回指向只读数据的指针
    const char* get_str() const { return str; }
    // 非const对象调用此版本,返回可修改的指针
    char* get_str() { return str; }

    Mystring(const Mystring &source) : str{nullptr} 
    {
        // source是const对象,调用const版本get_str,返回const char*
        // source.get_str()[0] = 'h'; // 此行会触发编译错误,符合const语义要求
        size_t len = std::strlen(source.get_str());
        str = new char[len + 1];
        std::strcpy(str, source.get_str());
    }
};

通过这种方式,编译器会强制限制const对象的字符串数据为只读,非const对象仍可正常修改自身内容,同时保留了类内部对数据的修改权限。

改用std::string替代裸指针(推荐)

直接使用标准库的std::string管理字符串,它已经内置了完善的const语义控制,无需手动处理裸指针的内存和权限问题:

class Mystring{
 private:
    std::string str;

 public:
    Mystring(const Mystring &source) : str{source.str} 
    {
        // source.str[0] = 'h'; // const对象的std::string内容不可修改,编译报错
    }
};

这种方法不仅彻底解决了const限定的问题,还避免了手动内存管理带来的内存泄漏、越界访问等风险,是C++字符串处理的最佳实践。

修改成员变量类型为const char*(不推荐)

将私有成员改为const char*,此时const对象的指针指向内容天然不可修改,但类内部需要修改数据时必须用const_cast去除const限定,这会破坏const的安全性,容易引发未定义行为,仅在特殊场景下考虑:

class Mystring{
 private:
    const char* str;

 public:
    Mystring(const Mystring &source) : str{nullptr} 
    {
        // source.str[0] = 'h'; // 编译错误,无法修改const char*指向的内容
        size_t len = std::strlen(source.str);
        char* temp = new char[len + 1];
        std::strcpy(temp, source.str);
        str = temp; // const char*可指向非const内存,但后续无法通过str修改内容
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:40:36