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

牛客网 SQL1查询所有列
SQL1查询所有列 select id,device_id,gender,age,university,province from user_profile 每日问题 C 中面向对象编程如何实现数据隐藏? 在C中,面向对象编程(OOP)通过封装(Encapsulation)实现数据隐藏。…...

【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
问题描述 根据操作手册正常拉取代码,然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...

如何使用ERC404协议
ERC404 ERC404协议的性质 ERC404不是一个开发代码工具包,而是一种智能合约标准规范。它就像是一份蓝图或者规则手册,规定了在以太坊区块链上开发特定智能合约应该遵循的接口、函数和事件等规则。如何使用ERC404协议 定义合约接口 首先,在开发智能合约时,要根据ERC404标准定…...

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

ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object
问题:核心的灾备 RAC ADG 备库,这两天频繁重启,并且报如下错误,通过查看MOS,发现是个BUG ADG备库的ALERT错误日志如下: Errors in file /u01/app/oracle/diag/rdbms/hxxxsz/hxxxsz1/trace/hxxxsz1_lgwr_69…...

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置
在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…...

git使用教程(超详细)-透彻理解git
一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

【2024 Dec 超实时】编辑安装llama.cpp并运行llama
首先讲一下环境 这是2024 年12月,llama.cpp 的编译需要cmake 呜呜呜 网上教程都是make 跑的。反正我现在装的时候make已经不再适用了,因为工具的版本,捣鼓了很久。 ubuntu 18 conda env内置安装。 以下是可以完美编译llama.cpp的测试工具版…...

Docker介绍、安装、namespace、cgroup、镜像-Dya 01
0. 容器简介 从生活上来说,容器是一种工具,可以装东西的工具,如衣柜、背包、行李箱等等。 从IT技术方面来说,容器是一种全新的虚拟化技术,它提高了硬件资源利用率,结合k8s还可以让企业业务快速横向扩容、业…...

docker 搭建自动唤醒UpSnap工具
1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件,进行配置: version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…...

3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级
汽车行业已迎来智能化的汹涌浪潮,在此背景下,零部件制造商唯有积极应对,以智能制造为核心驱动力,方能跟上行业发展步调,在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一,汽车钣金件亦需紧…...

基于Matlab实现三维地球模型(源码)
利用MATLAB强大的图形处理能力和数学计算功能构建的可视化应用。这个模型允许用户在三维空间中观察地球,并且能够动态地旋转地球模型,同时还可以模拟卫星在其周围的运动轨迹,为学习地球科学、天文学以及航天工程等领域提供了一个直观的教学工…...

【Tomcat】第五站:Servlet容器
Tomcat启动后,获取到项目当中所有的servlet的WebServlet中的配置信息。将配置信息和类对象都写入一个map集合当中。 map就是一个key-value类型的集合。 在MyTomcat中我们获取到了类对象和注解值。 Tomcat与请求连通 1. ServletConfigMapping 1. 创建一个config包…...

CTF 攻防世界 Web: FlatScience write-up
题目名称-FlatScience 网址 index 目录中没有发现提示信息,链接会跳转到论文。 目前没有发现有用信息,尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…...

【SpringBoot中MySQL生成唯一ID的常见方法】
SpringBoot中MySQL生成唯一ID的常见方法 在Spring Boot中,为MySQL生成唯一ID有多种方式,每种方式都有其特定的概念、优越点和使用场景。以下是详细的说明和代码示例: UUID 概念: UUID(Universally Unique Identifier࿰…...

使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作
使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作,包括开启日志归档和用户授权。 flink官方参考资料: https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/oracle-cdc/ 操作步骤: 1.启用…...

c++作业7
模拟一个游戏场景 有一个英雄:初始所有属性为1 atk,def,apd,hp 游戏当中有以下3种武器 长剑Sword: 装备该武器获得 1atx,1def 短剑Blade: 装备该武器获得 1atk,1spd 斧头Axe: 装备该…...

vue 上传组件 vxe-upload 实现拖拽调整顺序
vue 上传组件 vxe-upload 实现拖拽调整顺序,通过设置 drag-sort 参数就可以启用拖拽排序功能 官网:https://vxeui.com/ 图片拖拽排序 <template><div><vxe-upload v-model"imgList" mode"image" multiple drag-sor…...

Windows 环境实战开源项目GFPGAN 教程
GFPGAN GFPGAN(Generative Facial Prior-GAN)是由腾讯ARC(Applied Research Center)开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化,尤其在低质量人脸图像的超分辨率恢复方面表现出色。以…...

UE5 做简单的风景观光视频
A、思路 新建摄像机,关卡序列, 镜头试拍录制器,新建镜头轨道,拖入摄像机, 变换,设置多个关键帧,改变摄像机在场景中的位置, 完成后,导出即可。 B、参考图...

k8s服务搭建与实战案例
Kubernetes(K8s)作为一个开源的容器编排平台,广泛应用于现代的云原生应用架构中。以下是一些常见的 **Kubernetes 实战案例**,包括从基础部署到高级应用场景的使用。通过这些案例,可以更好地理解 K8s 的运作原理和最佳…...

JavaScript学习难点
一、语法的灵活性 动态类型: JavaScript 是一种动态类型语言,这意味着变量的类型可以在运行时改变。这与静态类型语言(如 Java、C)形成鲜明对比,在静态类型语言中,变量的类型在编译时就已经确定。 例如&am…...

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览
文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 姊妹篇: Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF(二)使用 QtPdfium库实现…...

解决创建laravel项目,使用国外镜像超时,国内镜像缺包的问题
解决创建laravel项目,使用国外镜像超时,国内镜像缺包的问题 一、前言二、切换镜像三、创建最新版本四、创建指定版本 一、前言 最近想下载 laravel 框架看看,但也遇到了些麻烦,这里做个记录。 二、切换镜像 先查看镜像源&#…...

Java泛型设计详解
引言 在日常Java开发中,泛型是一个非常重要的特性。它提供了编译时的类型安全检查,增强了代码的可读性和可维护性。然而,对于初学者甚至一些有经验的开发者来说,泛型的使用和理解仍然是一个挑战。本文旨在深入探讨Java泛型的诞生…...

用ue5打开网址链接
需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度,按下Tab键后就会打开百度的网页...

【大数据】-- 读放大和写放大
目录 一、定义 1. 读放大(Read Amplification) 定义 原因 优化方法 2. 写放大(Write Amplification) 定义 原因 优化方法 对比与联系 二、举例 1. Hadoop(HDFS) 读放大 写放大 2. Flink 读放大 写放大 3. Hive 读放大 写放大 4. Presto 读放大 写放…...

【前端】JavaScript 抽取字符串特定部分题目详解与实现思路
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯题目描述💯核心步骤与实现解析1. 分割字符串为数组(split 方法)2. 使用 filter 提取名字(偶数索引判断)3. 使…...

CNCF云原生生态版图-分类指南(一)- 观测和分析
CNCF云原生生态版图-分类指南(一)- 观测和分析 CNCF云原生生态版图-分类指南一、观测和分析(Observability and Analysis)(一)可观测性(Observablility)1. 是什么?2. 解决…...

热更新解决方案3 —— xLua
概述 xLua框架导入和AB包相关准备 xLua导入 其它的导入 C#调用Lua 1.Lua解析器 using System.Collections; using System.Collections.Generic; using UnityEngine; //引用命名空间 using XLua;public class Lesson1_LuaEnv : MonoBehaviour {// Start is called before the fi…...