为何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
相关产品推荐
相关产品推荐

