当前位置: 首页 > news >正文

牛客网 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 中面向对象编程如何实现数据隐藏&#xff1f; 在C中&#xff0c;面向对象编程&#xff08;OOP&#xff09;通过封装&#xff08;Encapsulation&#xff09;实现数据隐藏。…...

【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)

问题描述 根据操作手册正常拉取代码&#xff0c;然后编译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.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object

问题&#xff1a;核心的灾备 RAC ADG 备库&#xff0c;这两天频繁重启&#xff0c;并且报如下错误&#xff0c;通过查看MOS&#xff0c;发现是个BUG ADG备库的ALERT错误日志如下&#xff1a; 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有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

【2024 Dec 超实时】编辑安装llama.cpp并运行llama

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

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

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

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件&#xff0c;进行配置&#xff1a; version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…...

3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级

汽车行业已迎来智能化的汹涌浪潮&#xff0c;在此背景下&#xff0c;零部件制造商唯有积极应对&#xff0c;以智能制造为核心驱动力&#xff0c;方能跟上行业发展步调&#xff0c;在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一&#xff0c;汽车钣金件亦需紧…...

基于Matlab实现三维地球模型(源码)

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

【Tomcat】第五站:Servlet容器

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

CTF 攻防世界 Web: FlatScience write-up

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

【SpringBoot中MySQL生成唯一ID的常见方法】

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

使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作

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

c++作业7

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

vue 上传组件 vxe-upload 实现拖拽调整顺序

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

Windows 环境实战开源项目GFPGAN 教程

GFPGAN GFPGAN&#xff08;Generative Facial Prior-GAN&#xff09;是由腾讯ARC&#xff08;Applied Research Center&#xff09;开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化&#xff0c;尤其在低质量人脸图像的超分辨率恢复方面表现出色。以…...

UE5 做简单的风景观光视频

A、思路 新建摄像机&#xff0c;关卡序列&#xff0c; 镜头试拍录制器&#xff0c;新建镜头轨道&#xff0c;拖入摄像机&#xff0c; 变换&#xff0c;设置多个关键帧&#xff0c;改变摄像机在场景中的位置&#xff0c; 完成后&#xff0c;导出即可。 B、参考图...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...