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
成员只能被本类的成员函数和友元函数访问。合理使用这两个关键字可以提高代码的安全性和可维护性。