在C++中Private和Protected的区别(带例子)

在C++中Private和Protected的区别(带例子)

C++中,类可以使用三种不同的访问修饰符:public, private和protected。这些修饰符的作用是控制类的成员在外部代码中的可见性和可访问性。其中,private和protected是比较常用的访问修饰符,但是它们有什么不同呢?在本文中,我们将详细说明private和protected的区别,并提供相应的示例代码。

Private和Protected的定义

private和protected是两种访问修饰符,它们的定义如下:

  • Private:被标记为private的成员只能由同一类中的其他成员(包括成员函数)访问。这意味着,私有成员对于类外的代码是不可见和不可访问的。
  • Protected:被标记为protected的成员可以被同一类中的其他成员(包括成员函数)和其子类中的成员访问,但是对于类外的代码是不可见和不可访问的。

Private和Protected的示例代码

为了更好地理解private和protected之间的区别,下面我们将用示例代码来说明它们的差异。

私有成员变量和私有成员函数

考虑下面的类:

class MyClass {
private:
    int privateVar;

    void privateFunc() {
        cout << "Private function" << endl;
    }

public:
    void publicFunc() {
        cout << "Public function" << endl;
    }
};

这个类包含一个私有成员变量privateVar和一个私有成员函数privateFunc。同时,它还包含一个公有成员函数publicFunc。

现在,我们尝试从类的外部访问privateVar和privateFunc:

MyClass obj;

// 访问私有成员变量
obj.privateVar = 10; // 编译错误:’int MyClass::privateVar‘ is private

// 调用私有成员函数
obj.privateFunc(); // 编译错误:’void MyClass::privateFunc()‘ is private

在这个示例中,我们尝试访问MyClass对象的私有成员变量和私有成员函数。然而,由于这些成员被标记为private,所以它们对于类的外部代码是不可见和不可访问的。因此,编译器会抛出错误,指示我们无法访问这些成员。

正常情况下,我们只能通过公有成员函数publicFunc来访问privateVar和privateFunc:

MyClass obj;

// 调用公有成员函数
obj.publicFunc(); // 输出:Public function

在这个示例中,我们对MyClass对象调用公有成员函数publicFunc。由于publicFunc是一个公有函数,它可以访问privateVar和privateFunc,因此我们可以正确地执行这个函数。

受保护成员变量和受保护成员函数

接下来,我们考虑一个包含受保护成员变量和受保护成员函数的类:

class MyBaseClass {
protected:
    int protectedVar;

    void protectedFunc() {
        cout << "Protected function" << endl;
    }
};

class MyDerivedClass : public MyBaseClass {
public:
    void accessProtected() {
        protectedVar = 10; // 可以访问受保护成员变量
        protectedFunc(); // 可以访问受保护成员函数
    }
};

这个示例包含两个类:MyBaseClass和MyDerivedClass。MyDerivedClass是MyBaseClass的子类,因此它可以继承MyBaseClass的所有成员。MyBaseClass中只包含一个受保护成员变量protectedVar和一个受保护成员函数protectedFunc。因为这些成员被标记为protected,所以它们可以被MyDerivedClass的代码访问。

现在,我们尝试在MyDerivedClass中访问protectedVar和protectedFunc:

MyDerivedClass obj;

obj.accessProtected(); // 调用accessProtected函数

// 访问受保护成员变量
obj.protectedVar = 20; // 编译错误:’int MyBaseClass::protectedVar‘ is protected within this context

// 调用受保护成员函数
obj.protectedFunc(); // 编译错误:’void MyBaseClass::protectedFunc()‘ is protected within this context

在这个示例中,我们通过调用accessProtected函数来访问MyDerivedClass对象的受保护成员变量和受保护成员函数。由于这些成员被标记为protected,所以它们可以被MyDerivedClass中的代码访问。但是,当我们尝试直接访问这些成员时,编译器会抛出错误,指示我们无法访问这些成员,因为它们对于类的外部代码是不可见和不可访问的。

结论

C++中,private和protected是两种访问修饰符,用于控制类成员的可见性和可访问性。私有成员对于类的外部代码是不可见和不可访问的,而受保护成员可以被类的子类访问。因此,在设计类时,需要根据具体的情况和需求来选择合适的访问修饰符。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程