C++中protected和private的区别

在C++中,我们经常会遇到protected和private这两个访问修饰符。它们都用来控制类的成员的访问权限,但有着不同的作用。在本文中,我们将详细介绍protected和private在C++中的区别以及在实际开发中的应用场景。
访问权限
在C++中,成员变量和成员函数的访问权限分为三种:public、protected和private。
public指的是公共的,任何类的成员函数、友元函数和外部代码都可以访问。protected指的是保护的,只有本类的成员函数、友元函数和派生类的成员函数可以访问。private指的是私有的,只有本类的成员函数和友元函数可以访问。
区别
访问范围
protected和private的主要区别在于其访问范围不同。protected成员可以被该类的成员函数、友元函数和派生类的成员函数访问,而private成员只能被该类的成员函数和友元函数访问。下面是一个简单的示例代码:
#include <iostream>
class Base {
public:
void foo() {
std::cout << "Base::foo() called" << std::endl;
}
protected:
void bar() {
std::cout << "Base::bar() called" << std::endl;
}
private:
void baz() {
std::cout << "Base::baz() called" << std::endl;
}
};
class Derived : public Base {
public:
void test() {
foo(); // 可以访问Base类的public成员函数
bar(); // 可以访问Base类的protected成员函数
// baz(); // 无法访问Base类的private成员函数
}
};
int main() {
Derived d;
d.test();
return 0;
}
在上面的示例中,Derived类继承自Base类。在Derived类的成员函数test()中,可以访问Base类的foo()和bar()成员函数,但无法访问Base类的baz()成员函数,因为baz()是private的。
继承
当一个类继承另一个类时,protected成员会被继承到派生类中,而private成员不会。因此,派生类无法直接访问基类的private成员。下面是一个示例代码:
#include <iostream>
class Base {
private:
int privateVar = 10;
protected:
int protectedVar = 20;
public:
int publicVar = 30;
};
class Derived : public Base {
public:
void test() {
// std::cout << privateVar; // 无法直接访问Base类的private成员变量
std::cout << protectedVar << std::endl; // 可以直接访问Base类的protected成员变量
std::cout << publicVar << std::endl; // 可以直接访问Base类的public成员变量
}
};
int main() {
Derived d;
d.test();
return 0;
}
在上面的示例中,Derived类继承自Base类,可以直接访问protectedVar和publicVar,但无法直接访问privateVar。
应用场景
在实际开发中,我们应该根据需求选择恰当的访问修饰符。
- 当需要在派生类中访问基类的成员时,可以使用
protected修饰符。 - 当需要限制对类的成员的访问权限时,可以使用
private修饰符。
在设计类的时候,合理使用protected和private可以使代码更具灵活性和安全性。
总结
在C++中,protected和private都是用来控制类的成员的访问权限的关键字,其区别在于访问范围不同。protected成员可以被本类的成员函数、友元函数和派生类的成员函数访问,而private成员只能被本类的成员函数和友元函数访问。合理使用这两个关键字可以提高代码的安全性和可维护性。
极客笔记