c++ - C++实例级封装

标签 c++ encapsulation

我有一个分为两部分的问题。首先,我了解到 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/

相关文章:

c++ - C++读取用户输入而无需按回车键(Mac OS X),与Turbo Pascal中的readkey相同

c++ - boost::format 形式的 c 字符串或 std::string

c# - 用于公开列表成员的 IEnumerable vs IReadonlyCollection vs ReadonlyCollection

php - 为什么在函数内部使用 "global"引用被认为是不好的做法?

javascript - 一种功能和一种封装形式?

c++ - 使用 Catboost C 评估库 API

c# - BadImageFormatException 处理

c# - 为什么私有(private)成员变量可以被类实例改变?

c++ - 为什么 C++11 没有模板类型定义?

java - 我应该返回集合还是流?