我有一个分为两部分的问题。首先,我了解到 C++ 仅提供类级别的数据封装,这意味着同一类的所有对象都可以访问彼此的私有(private)成员。我理解这样做的原因,但发现一些链接(即 http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/ )似乎与这一点相矛盾,建议我可以执行以下操作:
class testclass {
private:
// Below would be an instance-level variable, and new memory for it is set aside
// in each object I create of class testclass
int x;
// Below would be a class-level variable, memory is set aside only once no matter
// how many objects of the same class
static int y;
}
我想做的实际上是让这项工作有效,即我想在一个类中定义一个变量,该变量在每个实例化中都是私有(private)的(这是我的第二个问题)。由于上面的代码片段似乎没有实现这一点,是否有一种变通方法可以用来创建对单个对象私有(private)的数据?谢谢!
编辑:
的确,我仍在学习 OO 基础知识。我将使用无处不在的汽车示例来展示我正在尝试做的事情,我确信这一定是一件很常见的事情。我欢迎就如何重新考虑它提出任何建议:
class car {
private:
int mileage;
public:
car(int); // Constructor
void odometer();
};
car::car(int m) {
mileage = m;
}
void car::odometer() {
return mileage;
}
int main(void) {
car ford(10000), honda(20000);
cout<<ford.odometer(); //Returns 20000, since honda constructor overwrites private variable 'mileage'
}
有没有办法让 odometer() 方法根据我的需要返回福特或本田的里程数?
最佳答案
特权(公共(public)、私有(private)、 protected )仅适用于名称。只有在解析名称时,编译器才会应用权限。一旦编译,所有这些信息都消失了。
在上面的示例中,在解析为 THOSE 变量的范围内对名称 x 和 y 的所有使用对于您的类都是私有(private)的。只有在您的类中声明的函数,无论它们是静态的还是非静态的,都能够按名称访问这些变量。
但是,如果您将变量提供给其他对象,然后这些对象可以使用具有其他权限的其他名称来引用该变量,则所有赌注都将取消。
关于“在每个实例中”,我不确定你在问什么。 AFAIK,没有本地方法可以将变量设为私有(private),这样只有该实例才能访问它。在所有情况下,实例都可以访问彼此的私有(private)部分。
我想有一些方法可以解决这个问题。首先是模板化您的类并为每个实例提供不同的类型。你可以用一个整数模板参数或其他东西来做到这一点。尽管当您尝试将这些类型作为同一类事物来处理时,这可能会让生活变得烦人。您必须虚拟化并拥有一个抽象基类或其他东西。
目前我能想到的只有这个方法。所有其他人都依赖于调用实体表现良好。
一般来说,您很少希望保护成员不受其他实例的影响。将相同类型传递给相同类型的常见情况是在复制和赋值期间,您基本上需要了解有关源的所有知识才能正确复制。我敢打赌,您需要重新考虑您要尝试做的事情,无论那是什么。
关于c++ - C++实例级封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15277480/