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

为何C++类私有成员可在成员函数中直接用strcpy赋值?

问题:C++类私有成员为何能在成员函数中直接访问?

我正在从JSON格式文件读取数据,想把值存入Configuration类的password_c和apiKeyValue_c私有成员中,代码如下:

class Configuration {
private:
    char password_c[32];
    char apiKeyValue_c[20];
public:
    String get_ApiKeyValue();
    void set_ApiKeyValue(char* apiKeyValue);

    String get_Password();
    void set_Password(char* password);
};

String Configuration::get_Password() {
    return password_c;
}

void Configuration::set_Password(char* password ) {
    strcpy(password_c, password); 
}  

String Configuration::get_ApiKeyValue() {
    return  apiKeyValue_c;
}

void Configuration::set_ApiKeyValue(char* apiKeyValue) {
    strcpy(apiKeyValue_c, apiKeyValue); 
}

// 注:原代码存在拼写笔误,此处修正为Configuration::loadFile
bool Configuration::loadFile() {

    if (!SPIFFS.begin()) {
        Serial.println("Failed to mount file system");
        while(true);
    }
  
    StaticJsonDocument<700> doc; 
    File file = SPIFFS.open(("/config.json"), "r");
    if (!file){
        Serial.println("Failed to open file for reading");
        //return;
    }

    DeserializationError error = deserializeJson(doc, file);
    if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return -1;
    } 

    strcpy(password_c, doc["password"]); // 我原以为这行不通,但它成功了,password_c是私有成员
    strcpy(apiKeyValue_c, doc["apiKeyValue"]);

    // - 测试
    Serial.println(get_Password()); // 值正确!
    Serial.println(password_c);     // 值正确! 
    file.close();
}

这段代码能正常运行,但我原本以为直接访问私有成员password_c和apiKeyValue_c是不允许的,而且测试时直接打印这两个私有成员也能输出正确值:

Serial.println(get_Password()); // 使用成员方法
Serial.println(password_c); // 直接访问(我不知道为何可行,因为它们是私有成员)

我原本觉得必须通过set方法来设置这些成员,想知道为什么现在能直接访问?


解答

这是因为类的成员函数(包括成员方法、构造函数、析构函数等)本身就有权限直接访问类的所有私有成员,这是C++封装规则的核心内容之一:

  • 私有成员的访问限制是针对类外部的代码,而非类内部的成员函数。
  • 你写的loadFile方法是Configuration类的成员函数,属于类内部代码,所以完全有权直接读写password_c和apiKeyValue_c这两个私有成员。

至于你觉得必须用set方法,那是类对外提供的规范化接口,目的是在设置值时可以做额外的校验、日志记录等操作,属于代码设计层面的规范,而非语法层面的强制要求。如果你的场景不需要这些额外逻辑,在成员函数里直接操作私有成员是完全合法且正常的写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:31