您的位置:首页 > 娱乐 > 明星 > 苏州企业网站建设公司只选亿企邦_合肥网站建设模块_做一个app平台需要多少钱_网络营销百度百科

苏州企业网站建设公司只选亿企邦_合肥网站建设模块_做一个app平台需要多少钱_网络营销百度百科

2025/4/18 16:57:45 来源:https://blog.csdn.net/2302_80908313/article/details/144434709  浏览:    关键词:苏州企业网站建设公司只选亿企邦_合肥网站建设模块_做一个app平台需要多少钱_网络营销百度百科
苏州企业网站建设公司只选亿企邦_合肥网站建设模块_做一个app平台需要多少钱_网络营销百度百科

概念

在 C++ 中,面向对象编程(OOP)中的数据隐藏是指将对象的内部数据(成员变量)保护起来,只允许通过特定的公共接口(方法)去访问和修改这些数据。这种做法可以确保对象的状态保持一致,防止外部代码意外地修改对象的内部状态,并增加程序的安全性和可维护性。

数据隐藏的主要方法

使用访问修饰符

  • C++ 提供了三种访问修饰符:private、protected 和 public。
    • private 成员只能在类内部访问,外部无法直接访问。
    • protected 成员可以在类及其派生类中访问,但在外部无法访问。
    • public 成员可以在任何地方访问。
#include <iostream>  class Account {  
public:  Account(double initial_balance) : balance(initial_balance) {}  // 公共接口:存款方法  void deposit(double amount) {  if (amount > 0) {  balance += amount;  }  }  // 公共接口:取款方法  void withdraw(double amount) {  if (amount > 0 && amount <= balance) {  balance -= amount;  }  }  // 公共接口:获取账户余额  double getBalance() const {   return balance;   }  private:  double balance; // 私有成员,无法在类外直接访问  
};  int main() {  Account myAccount(100.0); // 创建一个 Account 对象  myAccount.deposit(50.0); // 存款  std::cout << "Balance after deposit: " << myAccount.getBalance() << std::endl;  myAccount.withdraw(30.0); // 取款  std::cout << "Balance after withdrawal: " << myAccount.getBalance() << std::endl;  // 下面的代码会导致编译错误,因为 balance 是私有的  // std::cout << "直接访问余额: " << myAccount.balance << std::endl;  return 0;  
}

输出

Balance after deposit: 150  
Balance after withdrawal: 120

在这个示例中:

  • balance 是一个私有变量,直接在 main 函数中访问该变量会产生编译错误。
  • deposit、withdraw 和 getBalance 方法是公共接口,外部代码只能通过这些方法来操作账户余额。这就是一种数据隐藏的实现方式。

使用封装

  • 封装是 OOP 的基本原则之一,意味着将数据(属性)和操作这些数据的方法(行为)组合在一起,封装在一个类中。通过封装,可以将对象的内部实现细节隐藏起来,我们可以控制外部对数据的访问,同时提供可靠的接口来与这些数据交互,这样的设计使得程序更加模块化、可维护和可靠。
  • 封装的好处在于内聚性强,代码更易于管理,修改内部实现不会影响外部代码,只要公共接口不变。
#include <iostream>  
#include <string>  class Student {  
private:  std::string name; // 学生姓名  int age;          // 学生年龄  std::string id;   // 学生ID  public:  // 构造函数  Student(const std::string& name, int age, const std::string& id)  : name(name), age(age), id(id) {}  // 公共方法:获取学生姓名  std::string getName() const {  return name;  }  // 公共方法:设置学生姓名  void setName(const std::string& newName) {  name = newName;  }  // 公共方法:获取学生年龄  int getAge() const {  return age;  }  // 公共方法:设置学生年龄  void setAge(int newAge) {  if (newAge > 0) { // 只允许正数年龄  age = newAge;  } else {  std::cout << "Invalid age." << std::endl;  }  }  // 公共方法:获取学生ID  std::string getId() const {  return id;  }  // 公共方法:设置学生ID  void setId(const std::string& newId) {  id = newId;  }  // 打印学生信息  void printInfo() const {  std::cout << "Name: " << name << ", Age: " << age << ", ID: " << id << std::endl;  }  
};  int main() {  // 创建学生对象  Student student1("Alice", 20, "S001");  // 打印学生信息  student1.printInfo();  // 修改学生姓名和年龄  student1.setName("Alice Cooper");  student1.setAge(21);  // 打印更新后的学生信息  student1.printInfo();  // 尝试设置无效年龄  student1.setAge(-5); // 输出: Invalid age.  return 0;  
}

输出

Name: Alice, Age: 20, ID: S001  
Name: Alice Cooper, Age: 21, ID: S001  
Invalid age.

代码解析

1.私有数据成员:

  • name、age、id 被声明为私有数据成员。这意味着这些属性只能通过类的公共方
    法访问,而不能直接在 main 函数或其他外部代码中访问。

2.公共方法:

  • getName()、setName()、getAge()、setAge()、getId()、setId() 和 printInfo() 是公共成员函数,它们提供了对私有数据的访问和修改。这些方法形成了一个安全的接口,通过这个接口,外部代码可以与 Student 对象进行交互。

3.数据验证:

  • 在 setAge() 方法中,添加了一个简单的验证,以确保年龄的值为正数。这样可以防止对象处于不一致的状态。

4.构造函数:

  • Student 类提供构造函数,方便创建对象时初始化学生的基本信息。

使用友元函数和友元类

  • 如果需要某些特定的函数或类访问私有成员,可以通过友元机制实现。这使得特定的函数可以绕过访问控制,但这应谨慎使用,以免破坏数据隐藏的原则。
#include <iostream>  class Account {  
private:  double balance;  public:  Account(double initial_balance) : balance(initial_balance) {}  friend void displayBalance(const Account& account); // 声明友元函数  
};  void displayBalance(const Account& account) {  std::cout << "Account balance: " << account.balance << std::endl;  
}  int main() {  Account myAccount(200.0);  displayBalance(myAccount); // 友元函数可以访问私有成员  return 0;  
}

输出

Account balance: 200

在这个示例中,displayBalance 是一个友元函数,友元函数是一个独立于类的函数,但它可以访问类的私有数据。也就是它可以访问 Account 类的私有成员 balance。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com