首页 > 编程语言 >C++ 访问说明符详解:封装数据,控制访问,提升安全性

C++ 访问说明符详解:封装数据,控制访问,提升安全性

时间:2024-04-23 20:33:19浏览次数:18  
标签:封装 Person 封装数据 C++ 访问 说明符 public 属性

C++ 访问说明符

访问说明符是 C++ 中控制类成员(属性和方法)可访问性的关键字。它们用于封装类数据并保护其免受意外修改或滥用。

三种访问说明符:

  • public:允许从类外部的任何地方访问成员。
  • private:仅允许在类内部访问成员。
  • protected:允许在类内部及其派生类中访问成员。

示例:

class Person {
public:
  string name; // 公共属性,可从外部访问

private:
  int age; // 私有属性,仅在类内部可见

protected:
  string address; // 受保护属性,可在类及其派生类中访问
};

解释:

  • Person 类中,name 属性是公共的,这意味着可以在类外部创建对象并直接访问该属性:
Person p1;
p1.name = "Alice";
  • age 属性是私有的,只能在类内部的成员函数中访问:
Person p2;
// p2.age = 30; // 错误:age 是私有的
  • address 属性是受保护的,可以在 Person 类及其派生类中访问:
class Employee : public Person {
public:
  void printAddress() {
    cout << address << endl; // 可以访问受保护属性
  }
};

总结:

  • 使用访问说明符来封装类数据,使其免受意外修改或滥用。
  • 将属性默认设置为私有,并在需要时显式将其设置为 public 或 protected。
  • 仅在必要时使用 public 访问权限,并优先使用 private 或 protected 以提高安全性。

附加说明:

  • 静态成员函数通常具有 public 访问权限,因为它们与类本身相关,而不是与特定对象相关。
  • 访问说明符仅控制访问权限,不能赋予修改权限。即使属性是 public 的,也需要确保您有权对其进行修改。

C++ 封装

封装是面向对象编程(OOP)的核心概念之一,它强调将数据隐藏在实现细节之后,只暴露必要的接口进行交互。在 C++ 中,封装可以通过访问说明符(public、private 和 protected)来实现,并结合使用 setter 和 getter 方法来控制对私有数据的访问。

封装的优点:

  • 数据安全性: 封装有助于保护数据免受意外修改或滥用,因为它限制了对私有成员的直接访问。
  • 代码维护性: 封装使代码更易于理解和维护,因为它隐藏了实现细节,只暴露必要的接口。
  • 代码可重用性: 封装的代码通常更易于重用,因为它可以独立于其他代码进行修改或扩展。

在 C++ 中实现封装:

  1. 使用访问说明符: 将类成员(属性和方法)声明为 private 以隐藏它们,或声明为 public 以允许外部访问。
  2. 使用 setter 和 getter 方法: 为私有属性创建公共的 getter 和 setter 方法,用于读取和设置属性值。

示例:

class Person {
private:
  string name;
  int age;

public:
  // Getter 方法
  string getName() {
    return name;
  }

  // Setter 方法
  void setName(string n) {
    name = n;
  }

  // Getter 方法
  int getAge() {
    return age;
  }

  // Setter 方法
  void setAge(int a) {
    age = a;
  }
};

int main() {
  Person p1;
  p1.setName("Alice");
  p1.setAge(30);

  cout << p1.getName() << " is " << p1.getAge() << " years old." << endl;
  return 0;
}

解释:

  • Person 类包含两个私有属性:nameage
  • 为了访问这些属性,提供了公共的 getter 和 setter 方法:getName(), setName(), getAge()setAge()
  • main() 函数中,我们创建了一个 Person 对象并使用 setter 方法设置其属性值。
  • 然后,我们使用 getter 方法获取属性值并输出它们。

总结:

封装是 C++ 中面向对象编程的重要基石。通过有效地封装类数据,您可以提高代码的安全性、维护性和可重用性。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

标签:封装,Person,封装数据,C++,访问,说明符,public,属性
From: https://www.cnblogs.com/xiaowange/p/18153698

相关文章

  • springboot 接口限制访问频率
     1.自定义注解@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceRateLimit{//默认最大访问次数intvalue()default3;//默认时间窗口(秒)longduration()default60;} 2.创建拦截器处理频率逻辑@Slf4......
  • mongdb未授权访问
    背景:mongdb未授权访问,解决方案是加认证。由于:安装好MongoDB数据库后,默认是【非授权模式】(也就是不需要任何权限验证、不需要验证账户,直接在命令窗口中输入mongo回车,就可以进行相关操作),这是非常不安全的所以:为了数据的安全,我们都应该去配置数据库的访问权限和修改默认(mongo......
  • 深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。假如有这样的一段代码,代码中定义了一个Object类,类中有一个成员函数print,通过以下的两种调用方式调用:Objectb;Object*p=newObjec......
  • Linux服务器中Docker部署的GitLab镜像访问出现500错误
    一背景这几天发现在Linux服务器中Docker部署的GitLab镜像访问出现500错误,在重启服务器后大概10分钟再次出现该情况,后面登录服务器一步步排查最终解决问题,现在将解决问题的过程做一个总结。二过程分析首先第一步就是看看我们Docker目录下文件占用的情况,因为我们的Linux服务......
  • C++中的原子操作
    一、概述C++11提供了一个原子类型std::atomic<T>,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。原子指的是一系列不可被CPU上下文交换的机器指令,这些指令组合在一起......
  • 修改 DNS 配置加速Github访问
    1.3、设置Hosts文件和刷新文件地址:C:\Windows\System32\drivers\etc\hosts文件权限:RightClick>Properties>Security  文件修改:注意域名后不要有  域名刷新(Windows):[cmd]ipconfig/flushdns(Mac):sudokillall-HUPmDNSResponder 1.4、配置IP和......
  • springboot 统计接口耗时及指定时间接口访问次数
     1.使用AOP在不改变原有方法的基础上对接口方法增强,引入依赖<!--引入AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--引入Redis依赖--><depen......
  • 无root权限,解决conda环境的报错ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6:
    网上的方法都需要sudo或者root权限,但是服务器多是实验室公用,没有ruuto权限,因此更好的办法是通过conda只改自己虚拟环境的环境变量。问题原因问题的根本原因是Linux系统没有GLIBCXX_3.4.30动态链接库。这个库和gcc版本有关。因此要么你更换版本,要么找一个别的so链接到这个连接......
  • 62列表和元组访问速度对比
      importtimeimportrandom#python列表和元组通过千万级别的数据访问,对比耗时时间,元组访问速度不一定比列表快,还是列表略快过元组。defListTime():print('正在计算访问列表元素耗时时间')l=[iforiinrange(10000000)]t1=time.time()for_......
  • C++ Standard Library
    C++StandardLibraryarchitecure&sourcesc++官网C标准库->一个一个单一的函数function->彼此几乎无关联c++标准库->六个部分->彼此之间有紧密的关联c++标准库主要是用模板做出来的泛型编程(GenericProgramming)使用模板作为主要工具来编写程序->templates模......