在c ++语言中有“公共”,“私有”和“受保护”。我尝试了两种简单的程序。
以下是c ++中的第一个案例。
class A {
public:
string name;
}
int main(void) {
A a;
a.name;
}
而且,第二种情况......
class A {
protected:
string name;
public:
string getName(void) {
return name;
}
}
int main(void) {
A a;
//a.name; //can't access
cout << a.getName();
}
两种情况哪一种更好?
因为必须隐藏信息,我认为第二个可能更好。但在第二个中,它还可以通过使用函数getName()
来访问“name”变量。如果是这样,虽然第一个比第二个简单,但我为什么要使用第二个呢?换句话说,为什么使用protected
?
答案 0 :(得分:0)
第二个是更好的类,我们将数据紧密地封装到类中,并且还允许使用protected来继承范围。成员名称只能由类的成员函数更改。
在第一课中,通过将成员作为公共成员,我们允许程序中的外部函数操纵数据,这实际上并不是一个好的编程实践。
答案 1 :(得分:0)
封装
在第一个例子中,任何人都可以以他们希望的任何方式使用名称。在这个微不足道的例子中,他们不会造成太大的伤害,但如果name
是“弗雷德”并将其更改为“巴尼”会导致程序崩溃怎么办?
A.name = "Barney";
程序现在崩溃了。
在第二个示例中,name
无法访问。 getName
会返回name
的副本。收件人可以对此副本执行任何操作,而不会损坏A
的内部状态,因此
string temp = A.getName();
temp = "Barney";
绝对没有。
将此视为对象的自我防御。现在,每个对象都可以控制其内部状态的修改方式,并可以保护自己免受意外误用和损坏。
A
的用户甚至不必知道他们从getName
获得的内容是如何存储的。他们所知道的只是他们得到string
。这会将A
与其用户分离。
答案 2 :(得分:0)
受保护的访问修饰符
受保护的访问修饰符可以在包内和包外部访问,但只能通过继承访问。
私人访问修改
私有访问修饰符只能在类中访问。 Private基本上用于抽象。
示例
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
A obj = new B();//compile time error
obj.msg();
}
}
Output:Hello
私人比受保护更严格