当我在学习 C++ 中的面向对象编程时,我很难理解公共、私有和受保护,因此我想我会分享一些想法,希望能解决其中的一些问题。
首先,public、private 和 protected 用于确定类中变量或方法的可访问性级别。如果将变量声明为私有变量,则可以在声明它的类内部访问该变量,但不能在其他任何地方访问。使用 protected,您可以在声明它的类的子类中访问该变量。使用 public,您可以在任何地方访问该变量。
那么这是什么意思呢?
使用您的代码,我们从以下开始:
#include <iostream>
using namespace std;
class Student
{
private:
string name;
};
class UndergraduateStudent : public Student
{
};
class GraduateStudent : public Student
{
};
class Freshman : public UndergraduateStudent
{
Freshman(string _name)
{
name = _name;
}
};
出现编译错误的原因是您试图访问 Freshman 类中的变量“name”。 Freshman 是 Student 的子类(嗯,它实际上是 Undergraduate Student 的子类,是 student 的子类,但这个概念仍然适用)。因此,Freshman 类中的任何方法都只能访问 Student 类中的 protected 和 public 变量和方法。因此,如果您想访问新生类中的“姓名”,则必须将其从 private 更改为 protected 或 public。。 p>
但是,在这样做之后,您可能想知道如何从类外部访问私有变量和受保护变量?在 main() 中,如果新生姓名是私有的或受保护的,您将如何获得新生姓名的值?答案是 getter 和 setter。稍微修改一下你的代码,你会得到这样的结果:
#include <iostream>
using namespace std;
class Student
{
protected:
string name;
public:
string getName(){
return name;
}
void setName(string _name){
name = _name;
}
};
class UndergraduateStudent : public Student
{
};
class GraduateStudent : public Student
{
};
class Freshman : public UndergraduateStudent
{
public:
Freshman(){}
Freshman(string _name)
{
name = _name;
}
};
如您所见,我在 Student 中添加了几个 public 方法,getName() 和 setName()。我还在 Freshman 类中添加了一些构造函数。这些 Student 方法的重要部分是它们是公开的,并且可以在任何地方访问。代码不难理解,本质上getName()返回的是私有变量“name”的值,setName()可以改变这个值。
假设在 main() 中我想创建一个 Freshman 对象,并将她的名字声明为 Sarah,然后打印出结果。
int main(){
Freshman freshman("Sarah");
cout << freshman.name;
}
如果我这样做了,我会得到一个编译错误,因为我试图访问 protected 变量“name”。如果我想访问该值,我必须通过 public 方法 getName() 访问它。因此:
int main(){
Freshman freshman("Sarah");
cout << freshman.getName();
}
这将打印出“Sarah”的正确结果。现在,假设我拼错了她的名字,结果她的名字中没有“h”。然后,我必须调用 setName 的 public 方法才能将她的名字更改为其他名称。
int main(){
Freshman freshman("Sarah");
freshman.setName("Sara");
cout << freshman.getName();
}
现在将输出“Sara”的值。这些只是有关如何使用私有、受保护和公共的一些基本示例,如果有点冗长,请见谅。如果您还不太了解如何使用它们,我希望它可以帮助您。练习一下,多练几次就可以了。