牛客网 SQL1查询所有列

SQL1查询所有列

select id,device_id,gender,age,university,province from user_profile

每日问题

C++ 中面向对象编程如何实现数据隐藏?

在C++中,面向对象编程(OOP)通过封装(Encapsulation)实现数据隐藏。封装是一种将对象的属性和行为(即数据成员和成员函数)组合在一起,并对外界隐藏其内部细节的机制。这样,对象的内部状态只能通过特定的成员函数(如getter和setter)来访问和修改,从而保护数据不被外部直接操作,确保数据的一致性和安全性。

以下是实现数据隐藏的关键步骤和示例:

1.使用访问控制符:

        public:成员可以从任何地方访问。

        private:成员只能在类内部访问。

        protected:成员在类内部和派生类中访问。

通常,数据成员被声明为private,而成员函数(尤其是用于访问和修改数据成员的函数)被声明为public。

2.使用getter和setter方法:

        Getter方法用于返回对象的数据成员的值。

        Setter方法用于设置对象的数据成员的值。

以下是一个简单的示例,展示了如何使用封装和访问控制符来实现数据隐藏:

#include <iostream>
#include <string>class Person {
private:std::string name; // 姓名int age;         // 年龄public:// 构造函数Person(const std::string& name, int age) : name(name), age(age) {}// 获取姓名std::string getName() const {return name;}// 设置姓名void setName(const std::string& name) {this->name = name;}// 获取年龄int getAge() const {return age;}// 设置年龄,包含简单验证void setAge(int age) {if (age >= 0) { // 年龄必须为非负数this->age = age;} else {std::cerr << "无效的年龄!" << std::endl;}}// 显示人员信息void display() const {std::cout << "姓名: " << name << ",年龄: " << age << std::endl;}
};int main() {Person person("Alice", 30);// 通过公共方法访问数据std::cout << "初始人员信息:" << std::endl;person.display();// 使用setter方法修改数据person.setName("Bob");person.setAge(25);// 通过公共方法访问修改后的数据std::cout << "修改后的人员信息:" << std::endl;person.display();// 尝试设置无效的年龄person.setAge(-5);// 再次显示以查看无效年龄是否设置成功std::cout << "尝试设置无效年龄后的人员信息:" << std::endl;person.display();return 0;
}

在这个示例中:

        name和age数据成员被声明为private,因此它们不能在类外部直接访问。

        getName和setName方法用于访问和修改name。

        getAge和setAge方法用于访问和修改age,并且setAge方法包含了一个简单的验证逻辑,确保年龄不能为负数。

        display方法用于输出对象的当前状态。

这样,通过封装和访问控制符,我们实现了数据隐藏,并确保了数据的安全性和一致性。

C++中多态性在实际项目中的场景应用有哪些?

C++中的多态性是面向对象编程(OOP)中非常重要的一个概念,它使得相同的接口能够有不同的实现,从而增强了代码的灵活性、可维护性和可扩展性。主要有两种类型:编译时多态性(通常是函数重载和运算符重载)和运行时多态性(通过虚函数实现)。在实际项目中,C++的多态性有很多应用场景,以下一些典型的例子:

1. GUI应用程序中的事件处理

在图形用户界面(GUI)开发中,事件处理是一个常见的应用场景。例如,假设你有不同类型的按钮、文本框和其他控件,它们都可能响应用户的点击事件或输入事件。你可以使用多态来创建一个通用的事件处理系统,基类定义一个事件处理接口(例如handleEvent()),而不同的控件类(按钮、文本框等)则分别提供具体的实现。

class Widget {
public:virtual void handleEvent() = 0;  // 纯虚函数virtual ~Widget() = default;
};class Button : public Widget {
public:void handleEvent() override {// 按钮点击事件的处理代码}
};class TextBox : public Widget {
public:void handleEvent() override {// 文本框输入事件的处理代码}
};

在运行时,你可以通过基类指针调用子类的handleEvent()方法,引用不同的控件类型来执行不同的逻辑。

2.插件架构与扩展性

插件架构是另一个常见的应用场景。在插件系统中,插件通常是通过基类接口来统一管理和调用的,不同的插件实现了相同的接口,可以根据实际需要在运行时动态加载和卸载。利用多态性可以轻松地添加新的插件,而不需要修改系统的核心代码。

class Plugin {
public:virtual void execute() = 0;virtual ~Plugin() = default;
};class PluginA : public Plugin {
public:void execute() override {// PluginA 的实现}
};class PluginB : public Plugin {
public:void execute() override {// PluginB 的实现}
};

通过基类指针或引用,您可以在不关心特定插件类型的情况下执行相应的插件逻辑。

3.动物层次结构

一个典型的例子是在动物类层次结构中使用多态。假设你要处理不同种类的动物,每个动物都有一个sound()方法。通过多态,基类Animal可以定义一个统一的接口,而每个子类根据具体的动物类型实现自己的声音。

class Animal {
public:virtual void sound() const = 0;virtual ~Animal() = default;
};class Dog : public Animal {
public:void sound() const override {std::cout << "Woof!" << std::endl;}
};class Cat : public Animal {
public:void sound() const override {std::cout << "Meow!" << std::endl;}
};

然后,通过基类指针或,你可以统一调用sound()方法,不需要引用具体是哪种动物。

void makeSound(const Animal& animal) {animal.sound();  // 多态性:调用具体子类的 sound() 方法
}int main() {Dog dog;Cat cat;makeSound(dog);  // 输出: Woof!makeSound(cat);  // 输出: Meow!
}

4.图形学应用中的Shape类

在图形学相关的项目中,经常需要处理各种形状(如圆形、形状、三角形等)。通过多态性,你可以创建一个统一的基类(例如Shape),并为每个具体的形状类提供相应的实现,比如计算面积、稀疏图形等操作。

class Shape {
public:virtual double area() const = 0;virtual void draw() const = 0;virtual ~Shape() = default;
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double area() const override {return 3.14 * radius * radius;}void draw() const override {std::cout << "Drawing Circle" << std::endl;}
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double area() const override {return width * height;}void draw() const override {std::cout << "Drawing Rectangle" << std::endl;}
};

在实际项目中,你可以通过Shape类型的指针或引用来操作不同的形状对象,从而了解具体的形状类型。

5.支付系统

假设你有一个支付系统,可以处理不同的支付方式,如信用卡支付、宝支付、微信支付等。这些支付方式可以继承自一个基类PaymentMethod,并实现具体的支付逻辑。

class PaymentMethod {
public:virtual void processPayment(double amount) = 0;virtual ~PaymentMethod() = default;
};class CreditCard : public PaymentMethod {
public:void processPayment(double amount) override {std::cout << "Processing credit card payment of " << amount << std::endl;}
};class Alipay : public PaymentMethod {
public:void processPayment(double amount) override {std::cout << "Processing Alipay payment of " << amount << std::endl;}
};class WeChatPay : public PaymentMethod {
public:void processPayment(double amount) override {std::cout << "Processing WeChat payment of " << amount << std::endl;}
};

通过多态,您可以将不同的支付方式统一处理:

void processPayment(PaymentMethod* paymentMethod, double amount) {paymentMethod->processPayment(amount);
}int main() {CreditCard cc;Alipay alipay;WeChatPay wechatPay;processPayment(&cc, 100.0);processPayment(&alipay, 200.0);processPayment(&wechatPay, 300.0);
}

6.状态模式(State Pattern)

状态模式是一种行为设计模式,对象在内部状态改变时改变其行为。多态性在这种模式中应用得非常广泛。一个对象可以在多个状态之间切换,每个状态都实现了一个统一的接口。

class State {
public:virtual void handle() = 0;virtual ~State() = default;
};class ConcreteStateA : public State {
public:void handle() override {std::cout << "Handling state A" << std::endl;}
};class ConcreteStateB : public State {
public:void handle() override {std::cout << "Handling state B" << std::endl;}
};class Context {
private:State* state;
public:void setState(State* newState) {state = newState;}void request() {state->handle();}
};

总结

C++的多态性通过提供统一的接口和不同的实现,使得程序设计更加灵活、可扩展和可维护。在实际项目中,使用多态可以提高代码的复用性,简化维护工作,尤其是在需要时不同类型对象执行相同操作的场景中非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境安装Jenkins

Linux环境安装Jenkins Jenkins和JDK的版本 Jenkins和JDK的版本需要对应&#xff0c;不然无法正常启动。 Jenkins稳定版下载地址 Jenkins服务 手动使用命令启动和关闭Jenkins比较麻烦&#xff0c;所以可以把Jenkins设置成开机启动。 创建Jenkins.sh文件 JAVA_HOME和jenk…

软件测试面试(详细版)

软件测试 一、软件测试通常可以分为以下几种类型&#xff1a; 单元测试&#xff08;Unit Testing&#xff09;&#xff1a;针对软件的最小可测试单元&#xff08;如函数、方法&#xff09;进行测试&#xff0c;以确保其功能的正确性和健壮性。 集成测试&#xff08;Integrati…

ComfyUI 与 Stable Diffusion WebUI 的优缺点比较

ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品&#xff0c;两者存在诸多差异&#xff0c;本篇就带你熟悉二者的优劣&#xff0c;方便自己做出决策。 界面与操作 ComfyUI&#xff1a;界面简洁直观&#xff0c;通过节点和连线的方式构建工作流&#xff0c;用…

2024年第十五届蓝桥杯青少组C++国赛—割点

割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成&#xff0c;每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置&#xff0c;如果要使棋盘上出现两个及以上的棋子连通块&#xff0c;请问…

前端内网开发npm 安装的几种方法

1、介绍 最近有同学问我&#xff0c;怎么在不联网的情况下安装依赖。一般我们开发都是有网的&#xff0c;那么配置一下register一下镜像路径就可以从国内的阿里云&#xff0c;淘宝&#xff0c;华为云&#xff0c;腾讯云等国内镜像文件。 有些同学开发项目会在内网开发&#x…

【自动驾驶】Ubuntu22.04源码安装Autoware Core/Universe

【自动驾驶】Ubuntu22.04源码安装Autoware Core/Universe 官方源码安装教程前置条件安装ROS2 Humble安装Autoware Core/Universe配置开发环境配置工作空间设置控制台 官方源码安装教程 链接&#xff1a;https://autowarefoundation.github.io/autoware-documentation/main/ins…

uni-app Android平台上架要求的隐私政策提示配置方法【跨端开发系列】

文章目录 前言&#x1f4d6;一、前言二、DCloud 数据采集说明三、配置方式3.1 HBuilderX3.2.1及以上版本配置方式3.2 HBuilderX3.2.0及以下版本配置方法3.3 模板提示框3.4 无提示框 四、离线打包配置方式五、模板提示框六、二次确认提示框七、国际化八、隐私协议内容需要注意的…

鸿蒙Next持久化存储PersistentStorage用法总结

一、概述 PersistentStorage是应用程序中的可选单例对象&#xff0c;用于持久化存储选定的AppStorage属性&#xff0c;确保这些属性在应用程序重新启动时的值与关闭时相同。它将属性保留在设备磁盘上&#xff0c;UI和业务逻辑通过AppStorage访问其属性&#xff0c;AppStorage中…

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到&#xff1a;0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束&#xff0c;训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

LeetCode771 宝石与石头

题目描述 给定一个字符串 jewels&#xff0c;它代表石头中宝石的类型&#xff1b;另有一个字符串 stones&#xff0c;代表我们拥有的石头。其中&#xff0c;stones 里的每个字符对应一种石头类型&#xff0c;任务是要精准地统计出在 stones 当中&#xff0c;属于 jewels 所定义…

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势&#xff0c;包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构&#xff0c;主要依赖于控制流&#xff0c;其中上下文信息是嘈杂的&#xff0c;并且可能受到编译器优化的影响。为了解…

手搓一个极简远端git库

原文地址&#xff1a;手搓一个极简远端git库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 问题分析 公司一直用 gitlab &#xff08;或者 极狐 都是一样的&#xff09;作为代码管理库&#xff0c;但是看了一些文章说代码最小的管理只需要 g…

米哈游大数据面试题及参考答案

怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…

Linux 服务器下非root用户安装CUDA完整流程(多次踩雷经验总结)

参考博客&#xff1a; linux下安装cuda和cudnn&#xff08;非root权限&#xff09;_cuda下载安装 远程服务器 linux-CSDN博客 Linux下非root用户安装CUDA_linux下cuda-toolkit-archive-CSDN博客 非root用户安装cuda10.1&#xff0c;以及CUDA不同版本间切换_非root用户.run文…

Netty 常见面试题原理解析

Netty 是一个异步的、事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。在面试中&#xff0c;Netty 经常成为热门话题。本文将对一些常见的 Netty 面试题进行原理解析。 一、Netty 是什么&#xff1f; Netty 是一个基于 NIO&#xff08…

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现二叉排序树的基本算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;二叉树的创建、查找和删除算法。具体如下&#xff1a; (1)由…

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…