目前,我正在学习Java和C ++的基础知识。 我已经在《让我们C ++》一书中读到,出于安全目的,在几乎每种情况下,我们都将实例变量设为私有,并将方法设为公共。 但是在本书中还提到在某些情况下我们将变量设为公共变量并将方法设为私有。
我一直在思考,在这种情况下我们会这样做。 谁能解释一下。
您始终可以在用户不应该在意的类中需要实用程序功能。 如果您采用严格的功能,那就做一件事是非常好的。
@chris,先生,请您给我同样的例子。
如果您在C ++中执行单例,则构造函数将是私有的
请提高您的帖子质量(拼写,标点,句子开头的大写字母等)。
@Spook,谢谢,下次我会记住这一点...
私有方法(或C ++术语中的私有成员函数)通常用作辅助函数。例如,考虑您要实现分数但要确保始终对分数进行标准化的情况。然后,您可以使用私有成员函数normalize()来标准化您的分数,并在每次操作之后调用该函数,这可能会导致未标准化的分数,例如(C ++代码):
class Fraction
{
public:
Fraction(int num, int den = 1);
Fraction operator+=(Fraction const& other);
Fraction operator*=(Fraction const& other);
// ...
private:
int numerator, denominator;
};
Fraction::Fraction(int num, int den):
numerator(num),
denominator(den)
{
normalize();
}
Fraction Fraction::operator+=(Fraction const& other)
{
int new_den = denominator*other.denominator;
numerator = numerator*other.denominator + denominator*other.numerator;
denominator = new_den;
}
Fraction Fraction::operator*=(Fraction const& other)
{
numerator *= other.numerator;
denominator *= other.denominator;
normalize();
}
void Fraction::normalize()
{
int factor = gcd(numerator, denominator);
numerator /= factor;
denominator /= factor;
}
私有函数在C ++中的另一种特定用法是基于以下事实:在C ++中,私有仅与访问控制有关,而与可见性无关。这使得可以在基类中进行不可覆盖的事后条件检查,同时将实际函数设为虚拟:
class Base
{
public:
foo frobnicate(some arguments);
private:
virtual foo do_frobnicate(some arguments) = 0;
};
foo Base::frobnicate(some arguments)
{
check_precondition(arguments);
foo result = do_frobnicate(arguments);
check_post_condition(foo);
return foo;
}
从Base派生的类将覆盖do_frobnicate,而用户将调用frobnicate,无论派生类做什么,该命令始终检查前置条件/??后置条件。
公开变数呢?有什么理由吗?
@petric我的一般规则是所有变量都是公共的(一个结构),或者都不是。在第一种情况下,为了方便起见,我可能会添加构造函数(无论如何,在C ++ 03中,在C ++ 11中,统一的初始化语法基本上消除了这种需要),我想我可能想要私有函数供这些构造函数使用(尽管它肯定不是很频繁)。
通常,静态最终变量在类中是公共的。如果您不需要更改该变量的值并希望其他类访问它,则可以将其设为public static final。
私有方法仅在该类内部用于执行任务。就像实用程序方法或某些业务计算方法。或者只是将公共方法的代码分解为多个私有方法,以使方法不会变得太大。
根据经验,可以让其他类访问方法public。内部方法或辅助方法应该是protected或private。protected如果您希望方法可以被那些扩展您的类的人扩展,但是如果您不希望将它们标记为private。
私有变量或函数只能在声明了它们的类中使用。
公共变量或函数可以在应用程序中的任何地方使用。
因此,您应该将所有将在它们所属的类中使用的所有变量和函数声明为私有。
例:
public class Car {
private String model;
public setModel(String model) {
if (model != null)
this.model = model;
}
public getModel() {
return model;
}
private doSomething() {
model ="Ford";
}
}
在Car类中,我们将String模型声明为私有模型,因为我们将仅在Car类中使用它,这样做可以确保其他类在不使用setModel函数的情况下不能更改此String的值。
函数setModel和getModel是公共的,因此我们只能使用这些方法从其他类访问私有变量模型。
在此示例中,函数setModel检查该值是否为null,在这种情况下,它不设置该值。在这里,您可以看到,如果将String模型声明为公共模型,则无法控制它所记录的值。
函数doSomething是私有的,其他类不能使用它。另一方面,就像该函数是私有的,并且它属于String模型的相同类一样,它可以更改其值而无需使用setModel方法。
这取决于每个班级需要多少安全性。
例如,如果您有一个Vector类,该类仅具有3个变量x,y和z,则应将其公开。许多类都可能会使用Vector类,如果他们更改了其中的值就可以了。
如果您具有用于存储信用卡号,背景记录,地址等的Person类,则应将其设置为私有以避免安全问题。
但是,如果您将所有变量都设置为私有变量,并且为所有变量提供访问器和修改器,则可以有效地使它们像公共变量一样(但需要做更多工作)。
编辑:
所有常量变量都应该是公共的,因为无论如何您都不能更改它们。
静态变量可以是两种情况,具体取决于情况。为静态变量提供静态get和set函数可能更好。
我已经知道了...
没有理由让所有常量变量都公开。它们可能是实现细节,根本没有理由公开。
也没有理由要私有!为什么隐藏一些你无法改变的东西?
关键是要避免安全问题。没问题-不需要私人关键字。
不,那根本不是重点。为什么要公开客户不需要的东西?
@ ole_92接入点说明符绝对不限于安全性,并且取决于安全性的定义,无论如何,它对于此目的而言是严重不足的。通过清楚地记录什么是公共接口,访问说明符还提供了更好的封装。
@juanchopanza为什么将无法更改的内容设为私有?除非我要特别限制其他类查看常量,否则为什么要隐藏它?
@Cong Xu私有常量如何提供更好的封装?同样,除非不允许其他类查看该常量,否则我无法想到将其设为私有的一个原因。
为什么要公开一些不需要公开的东西?这是OOP的基本原理。
@ ole_92不是直接的,但是它们通过清楚地告诉读者它们不是公共接口的一部分来帮助封装。如果人们看到了一个公共常量,则尚不清楚他们是否应该对此进行关注,或者是否应该了解其实现细节。在默认情况下,在C ++和Java中事物是私有的,这是有原因的。
私有方法供该类的内部使用。可以从其他公共类中调用它们。那些是私人的,因为您是从外部世界倾覆而来的。
例如
public void method1(){
method2();
}
private void method2(){
// for internal use
}
公共变量主要用于类变量,在这种情况下,直接从外部访问变量没有危害。例如
public static final int FLAG = true;
您可以直接从外部调用该变量。
如果您不需要其他类中的变量或方法,则不要将其公开。这适用于方法和变量。
当某个方法要由该类的其他方法(公共)使用并且您不希望对象直接访问该方法时,我们将该方法设为私有。
在某些情况下,如果您想直接从类对象访问变量,则将其公开。