在C++中,public和private是访问修饰符(Access Specifiers),用于控制类成员(变量和函数)的访问权限,核心区别在于封装性的实现方式:
一、public 关键字
定义与作用
public声明的成员称为公共成员,可在类的外部任何地方被访问,包括类的实例对象、其他类或全局函数。
示例:

   class MyClass {
   public:
       int publicVar;      // 公共变量
       void publicFunc() {} // 公共函数
   };
   int main() {
       MyClass obj;
       obj.publicVar = 10;    // 允许:外部访问
       obj.publicFunc();      // 允许:外部调用
   }
   

设计意图
用于定义类的对外接口,即需要暴露给外部使用的功能或数据。
二、private 关键字
定义与作用
private声明的成员称为私有成员,仅能在类的内部成员函数中访问,外部代码(包括类的实例对象)无法直接访问。
例外:可被该类的友元函数(friend) 访问。
示例:

   class MyClass {
   private:
       int privateVar;      // 私有变量
       void privateFunc() {} // 私有函数
   public:
       void setVar(int val) { 
           privateVar = val; // 允许:内部访问
       }
   };
   int main() {
       MyClass obj;
       // obj.privateVar = 10;  // 错误:外部无法访问
       obj.setVar(10);        // 通过公共函数间接访问
   }
   

设计意图
用于隐藏类的内部实现细节,保护数据不被外部直接修改,确保封装性和安全性。
三、核心区别总结
特性    public    private    
访问范围    类内外均可访问    仅类内成员函数可访问(友元除外)    
封装角色    对外暴露的接口    隐藏的内部实现    
典型用途    提供公共操作方法或共享数据    保护敏感数据或内部逻辑    
继承影响    子类可继承并访问    子类无法直接访问(需通过父类接口)    
四、为什么需要区分?
C++通过public和private实现封装(Encapsulation):
public 定义了类与外部的交互方式,是用户可见的“契约”;
private 隐藏内部实现,允许开发者自由修改而不影响外部代码,提升代码可维护性和安全性。
💡 扩展说明:
除public和private外,C++还提供protected修饰符,用于允许子类访问父类成员,但外部仍不可访问。
 

C++ 中的 publicprivate访问修饰符,用于控制类成员的可见性和可访问性,是实现面向对象编程中封装特性的关键。

下面这个表格汇总了它们的核心区别,方便你快速理解:

特性

public(公有)

private(私有, 默认)

类内访问

✅ 允许

✅ 允许

派生类访问

✅ 允许

❌ 不允许

类外访问

✅ 允许

❌ 不允许

主要用途

定义对外的接口、无限制访问的成员

隐藏内部实现细节和数据

📌 基本概念与用途

  • public成员​:被声明为 public的成员(变量或函数)可以在类的内部、派生类以及类的外部通过对象自由访问。它定义了类与外部世界交互的接口

    class MyClass {
    public:
        int publicVar; // 公有变量
        void publicMethod() { // 公有方法
            // ... 可以访问私有和受保护成员
        }
    };
  • private成员​:被声明为 private的成员只能在定义它们的类的内部访问(其友元函数或友元类也可访问)。​派生类和外部代码均无法直接访问。这是类的默认访问权限​(如果未指定修饰符)。它用于隐藏类的实现细节和数据。

    class MyClass {
    private:
        int privateVar; // 私有变量,仅限类内访问
        void privateMethod() { // 私有方法,仅限类内调用
            // ... 
        }
    public:
        void setPrivateVar(int value) { // 通过公有方法间接操作私有数据
            privateVar = value;
        }
    };

🛠 如何选择:一个简单的例子

一个好的习惯是:​将数据成员设置为 private,然后通过 public的成员函数(如 Getter 和 Setter)来提供可控的访问和修改途径。这样做可以在函数中添加数据验证等逻辑,保证数据的完整性和安全性。

#include <iostream>
#include <string>

class Student {
private: // 将数据隐藏起来
    std::string name;
    int age;

public: // 提供公开的访问接口
    // 设置姓名
    void setName(const std::string& newName) {
        name = newName;
    }
    // 获取姓名
    std::string getName() const {
        return name;
    }
    // 设置年龄(可加入验证逻辑)
    void setAge(int newAge) {
        if (newAge > 0 && newAge < 120) { // 简单的有效性检查
            age = newAge;
        } else {
            std::cout << "Invalid age!" << std::endl;
        }
    }
    // 获取年龄
    int getAge() const {
        return age;
    }
};

int main() {
    Student student;
    student.setName("Alice");
    student.setAge(20); 

    // student.age = -100; // 错误:'age' 是私有的,无法直接访问
    // student.name = "Bob"; // 错误:'name' 是私有的,无法直接访问

    std::cout << "Name: " << student.getName() << ", Age: " << student.getAge() << std::endl;
    return 0;
}

💡 总结

简单来说:

  • 使用 public来定义类该做什么​(接口)。

  • 使用 private来隐藏类如何做​(实现细节)。

合理运用 publicprivate能有效提升代码的安全性可维护性模块化程度,是C++面向对象编程的基石。

更多推荐