C++学习路线(二十四)
静态成员函数
类的静态方法:
1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。
2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数)
1)静态数据成员
可以直接访问“静态数据成员”对象的成员函数(没有static的成员函数)内部,类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”即:所有的成员函数,都可以访问静态数据成员。类不能直接访问普通的静态数据成员(Human::humanCount非法)
2)静态成员函数
对象可以直接访问静态成员函数
类可以直接访问静态成员函数(Human::getHumanCount())在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员。
const数据成员
定义为const数据类型(常量数据成员)const数据成员的初始化方式
1.使用类内值(C++11支持)
我们猜一猜 类内初始值=2 然后再类外进行初始值定义 以哪个为准?
答案是报错,多次初始化
2.使用构造函数的初始化列表(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)
注意:不能在构造函数或其他成员函数内,对const成员赋值!
const static int count 可以类内赋值 ,但是去掉了const 就不可以了,得在类外赋值
组合和聚合
说明:组合和聚合,不是C++的语法要求,是应用中的常用手段
组合
构建一个计算机类,一台计算机,由CPU芯片,硬盘,内存等组成。
CPU 芯片也使用类来表示。
CPU.h
#pragma once
#include <string>
class CPU {
public:CPU(const char* brand = "intel", const char* version = "i5-7500");~CPU();
private:std::string brand;std::string version;
};
CPU.cpp
#include "CPU.h"
#include <iostream>CPU::CPU(const char* brand, const char* version) {this->brand = brand;this->version = version;std::cout << __FUNCTION__ << " called" << std::endl;
}CPU::~CPU() {std::cout << __FUNCTION__ << " called" << std::endl;
}
Computer.h
#pragma once
#include "CPU.h"class Computer {
public:Computer(const char* cpuBrand , const char* cpuVersion , int harDisk , int memory);~Computer();
private:CPU cpu;int hardDisk;int memory;
};
Computer.cpp
#include <iostream>
#include "Computer.h"Computer::Computer(const char* cpuBrand, const char* cpuVersion, int hardDisk, int memory) : cpu(cpuBrand, cpuVersion) {this->hardDisk = hardDisk;this->memory = memory;std::cout << __FUNCTION__ << " called" << std::endl;
}Computer::~Computer() {std::cout << __FUNCTION__ << " called" << std::endl;
}
main.cpp
#include <iostream>
#include "Computer.h"int main() {Computer computer1("intel" , "i9" , 1000 , 8);}
聚合
给计算机配备一台音响
Computer.h
#pragma once
#include "CPU.h"class VoiceBox {
public:VoiceBox() {}~VoiceBox() {}void VioceBoxOn() {std::cout << "Voice box is on." << std::endl;}
};class Computer {
public:Computer(const char* cpuBrand , const char* cpuVersion , int harDisk , int memory);~Computer();void addVoiceBox(VoiceBox* vb);
private:CPU cpu;int hardDisk;int memory;VoiceBox *voiceBox;
};
Computer.cpp
#include <iostream>
#include "Computer.h"Computer::Computer(const char* cpuBrand, const char* cpuVersion, int hardDisk, int memory) : cpu(cpuBrand, cpuVersion) {this->hardDisk = hardDisk;this->memory = memory;std::cout << __FUNCTION__ << " called" << std::endl;
}Computer::~Computer() {std::cout << __FUNCTION__ << " called" << std::endl;
}void Computer::addVoiceBox(VoiceBox* voiceBox) {this->voiceBox = voiceBox;std::cout << __FUNCTION__ << " called" << std::endl;
}
main.cpp
#include <iostream>
#include "Computer.h"int main() {VoiceBox voicebox1;{Computer computer1("intel", "i9", 1000, 8);computer1.addVoiceBox(&voicebox1);}voicebox1.VioceBoxOn();
}
可以看到Computer这个类不能左右VoiceBox的构造和析构。
聚合不是组成关系,被包含的对象,也可能被其他对象包含拥有者,不需要对被拥有的对象的生命周期负责。
项目-相亲系统
Girl.h
#pragma once
#include <iostream>
#include <string>
#include <vector>class Boy;class Girl {
public:Girl();Girl(std::string name, int age, int beauty);~Girl();int getAge() const;std::string getName() const;int getBeauty() const;std::string Description() const;bool satisfy(const Boy& boy) const;static void inputsGirls(std::vector<Girl>& girls);private:std::string name;int age;int beauty;
};
Boy.h
#pragma once
#include <string>
#include <vector>
class Girl;class Boy {Boy();Boy(std::string name, int age, int beauty);~Boy();int getAge() const;int getBeauty() const;std::string Description() const;bool satisfy(const Boy& other);static void inputsBoys(std::vector<Boy>& boys);
private:std::string name;int age;int beauty;
};
Girl.cpp
#include "girl.h"
#include "boy.h"
#include <string>
#include <sstream>#define YANZHI_FACTOR 1.1Girl::Girl(){}
Girl::Girl(std::string name, int age, int beauty) {this->name = name;this->age = age;this->beauty = beauty;
}
Girl::~Girl(){}
int Girl::getAge() const {return age;
}
std::string Girl::getName() const {return name;
}
int Girl::getBeauty() const {return beauty;
}
std::string Girl::Description() const {std::stringstream ss;ss << name << "颜值" << beauty << " 年龄" << age;return ss.str();
}bool Girl::satisfy(const Boy& boy) const {if(boy.getSalary() >= beauty * YANZHI_FACTOR) return true;return false;
}void Girl::inputsGirls(std::vector<Girl>& girls) {int age;std::string name;int beauty;int n = 1;while (1) {std::cout << "请输入第" << n << "位女孩的信息(输入0结束输入):" << std::endl;std::cout << "年龄:" << std::endl;std::cin >> age;if (age == 0) break;std::cout << "姓名:" << std::endl;std::cin >> name;std::cout << "颜值:" << std::endl;std::cin >> beauty;n++;girls.push_back(Girl(name, age, beauty));}
}
Boy.cpp
#include <sstream>
#include <string>
#include "boy.h"
#include "girl.h"#define SALARY_FACTOR 0.005Boy::Boy(){}
Boy::Boy(std::string name, int age, int salary) {this->name = name;this->age = age;this->salary = salary;
}
Boy::~Boy(){}
std::string Boy::getName() const {return name;
}
int Boy::getAge() const {return age;
}
int Boy::getSalary() const {return salary;
}
std::string Boy::Description() const {std::stringstream ss;ss << "Name: " << name << ", Age: " << age << ", Salary: " << salary;return ss.str();
}
void Boy::inputsBoys(std::vector<Boy>& boys) {int n = 1;std::string name;int age;int salary;while (1) {std::cout << "请输入第" << n << "位男孩的信息(输入0结束输入):" << std::endl;std::cout << "年龄:" << std::endl;std::cin >> age;if (age == 0) break;std::cout << "姓名:" << std::endl;std::cin >> name;std::cout << "工资:" << std::endl;std::cin >> salary;boys.push_back(Boy(name, age, salary));n++;}
}bool Boy::satisfy(const Girl& girl) {if (girl.getBeauty() >= salary * SALARY_FACTOR) {return true;}else return false;
}
main.cpp
#include <string>
#include <iostream>
#include "boy.h"
#include "girl.h"
using namespace std;void autoPair(vector<Boy>& boys, vector<Girl>& girls) {for (Boy& b : boys) {for (Girl& g : girls) {if (b.satisfy(g) && g.satisfy(b)) {cout << b.Description() << " and " << g.Description() << endl;}}}
}int main() {vector<Boy> boys;vector<Girl> girls;Boy::inputsBoys(boys);Girl::inputsGirls(girls);cout << "pairs\n" << endl;autoPair(boys, girls);
}
相关文章:
C++学习路线(二十四)
静态成员函数 类的静态方法: 1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。 2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数) 1)静态数据成员 可以直接访问“静态数据成员”对象的成…...
MySQL-存储过程/函数/触发器
文章目录 什么是存储过程存储过程的优缺点存储过程的基本使用存储过程的创建存储过程的调用存储过程的删除存储过程的查看delimiter命令 MySQL中的变量系统变量用户变量局部变量参数 if语句case语句while循环repeat循环loop循环游标cursor捕获异常并处理存储函数触发器触发器概…...
前端页面样式没效果?没应用上?
当我们在开发项目时会有很多个页面、相同的标签,也有可能有相同的class值。样式设置的多了,分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或: 在打开的工具中我们可以使用元素选择器,单击我…...
Mac apache配置cgi环境-修改httpd.conf文件、启动apache
Mac自带Apache,配置CGI,分以下几步: 找到httpd.conf。打开终端,编辑以下几处,去掉#或补充内容。在这个路径下写一个测试文件.py格式的,/Library/WebServer/CGI-Executables,注意第一行的python…...
多厂商的实现不同vlan间通信
Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口,打开接…...
sh与bash的区别
sh与bash的区别 结论:对于一般开发者,没有区别;对于要使脚本兼容较老系统,或者兼容其他shell(如ksh,dash),那么意义可能很重大,要确保自己代码没有bash扩展的特性。 区…...
D48【python 接口自动化学习】- python基础之类
day48 练习:开发自动咖啡(上) 学习日期:20241025 学习目标:类 -- 62 小试牛刀:如何开发自动咖啡机?(上) 学习笔记: 案例解析 定义类 定义属性和方法 clas…...
PostgreSQL(WINDOWS)下载、安装、简单使用
下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用,不能忘记。 打开pgAdmin,输入密码 新建数据库 打开命令工具 新建表...
Git的初次使用
一、下载git 找淘宝的镜像去下载比较快 点击这里 二、配置git 1.打开git命令框 2.设置配置 git config --global user.name "你的用名"git config --global user.email "你的邮箱qq.com" 3.制作本地仓库 新建一个文件夹即可,然后在文件夹…...
rocketmq服务的docker启动和配置
rocketmq的默认启动参数占用的内存实在是太大了,小于8G的电脑无法启动,docker中的开发环境又不可能用这么大,通用的该法是改sh文件 修改文件如下 runbroker.sh 默认8G JAVA_OPT"${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn…...
BLE和经典蓝牙相比,有什么优缺点
蓝牙低功耗(Bluetooth Low Energy,简称 BLE)和经典蓝牙(Bluetooth Classic,即 BR/EDR,Basic Rate/Enhanced Data Rate)是蓝牙技术的两种主要模式。两者都有各自的优缺点,具体如下&am…...
ECharts图表图例知识点小结
ECharts 图表图例简述 一、知识点 1. 作用: - 用于标识图表中的不同系列,帮助用户理解图表所展示的数据内容。 2. 位置: - 可以通过配置项设置图例的位置,如 top 、 bottom 、 left 、 right 等。 3. 显示状态控制:…...
LabVIEW非接触式模态参数识别系统开发
基于LabVIEW的模态参数识别系统采用非接触式声学方法,结合LabVIEW软件和高精度硬件,实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛,提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法,如锤击法&#x…...
厨艺爱好者的在线家园:基于Spring Boot的实现
1 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的…...
PostgreSQL使用clickhouse_fdw访问ClickHouse
Postgres postgres版本:16(测试可用)docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…...
docker 单节点arm架构服务器安装zookeeper、kafka并测试通信
kafka、zookeeper常用镜像介绍 kafka和zookeeper常见的镜像有以下三个:wurstmeister/zookeeper、kafka、confluentinc/cp-zookeeper、cp-kafka 和 bitnami/zookeeper、kafka。 wurstmeister/xxx: 由wurstmeister团队维护,提供的镜像适用于开发和测试环…...
AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统
AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量,能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统(NPMD)。通过对网络各个关键节点的监测,收集网络性能…...
单片机入门教程
单片机入门教程 单片机是一种将中央处理器(CPU)、存储器、输入输出接口等集成在一个芯片上的微型计算机系统。本教程将带你从零开始学习如何使用一款常见的单片机——ATmega328P,并编写简单的控制程序。 1. 单片机简介 1.1 什么是单片机&a…...
三维管线管网建模工具MagicPipe3D V3.5.3
经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…...
(二十三)、k8s(minikube) 部署mysql
文章目录 1、安装1.1、环境1.2、workbench 崩溃问题1.1、deployment.yaml 文件1.2、运行1.3、启动隧道,从宿主机直接访问 k8s 中的mysql 2、完整卸载 mysql(pod/deployment/service/pvc) 1、安装 1.1、环境 docker 部署 minikube,minikube …...
FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频
FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…...
微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件
要在微信小程序中关闭默认的 navigationBar,并使用自定义的 nav-bar 组件,你可以按照以下步骤操作: 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…...
FPGA 小鸟避障游戏
FPGA实现效果: FPGA 小鸟避障游戏 FPGA(Field Programmable Gate Array)即现场可编程门阵列,是一种可以编程的数字逻辑器件。基于FPGA的小鸟避障游戏是一种结合了硬件加速和算法优化来运行的实时交互游戏。这种游戏一般利用FPGA的…...
Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...
django5入门【03】新建一个hello界面
文章目录 1、前提条件⭐2、操作步骤总结3、实际操作示例 1、前提条件⭐ 将上一节创建的 Django 项目导入到 PyCharm 中。 2、操作步骤总结 (1)在 HelloDjango/HelloDjango 目录下,新建一个 views.py 文件。 (2)在 H…...
【Unity】Unity中调用手机的震动功能 包括安卓和IOS
直接上代码 #if UNITY_IOS[DllImport("__Internal")]private static extern void EX_C_CallVibrateE(int eID); #endif public static void CallVibrate(int eID){ #if UNITY_EDITOR#elif UNITY_ANDROIDlong miSec 30;if(eID 1520){miSec 60;}//通过报名获取ja…...
【软件工程】软件工程入门
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...
命名空间std, using namespace std
命名空间std,using namespace std 在标准C以前,都是用#include<iostream.h>这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中&#x…...
人工智能:未来生活与工作的变革者
随着人工智能(AI)技术的迅猛发展,越来越多的领域开始受益于AI的强大功能。从医疗、企业管理到日常生活,人工智能正在改变我们的世界。本文将深入探讨人工智能技术的应用前景,并分析它如何从根本上改变我们的生活和工作…...
采集网站怎么做/搜索排名竞价
nohup nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)…...
团队协同网站开发/专业搜索引擎seo服务
看了几本书,发觉自己好久没有看书了。 这几个月逛了几次书店,就今天的这次属于是有点进书店的感觉。《Professional C# 2008》真的很大一本,拿在手里看挺辛苦的。蹲着看了几章,还是中文比较好看懂,之前看2005的英文版。…...
thinkphpcmf网站开发/seo的重要性
Android Studio Profiler 检查内存简单介绍 如何使用? 第一步:点击Profiler按钮 第二步:选择 第三步:选择Capture heap dump 并点击Record 解释相关按钮的功能 垃圾桶按钮:用于强制执行垃圾回收事件的按钮ÿ…...
宁波网页制作设计营销/百度免费seo
本文由 【AI前线】原创作者|James Le 译者|尚剑 编辑|EmilyAI 前线导读:“毫无疑问,机器学习 / 人工智能的子领域在过去几年越来越受欢迎。目前大数据在科技行业已经炙手可热,而基于大量数据来进行预测或者…...
湖南建设监理官方网站/ip域名查询网站入口
1.创建用户 在命令行中执行以下操作: Step1 创建用户 sudo useradd username -m 注意要在后面加-m,否则不会在home路径下创建该用户的文件夹 创建好之后可以在/home/路径下查看该用户名的文件夹 在CLI中执行cat /etc/passwd可以查看passwd文件中是否有…...
手机网站自助建设/网站建设有多少公司
oracle分类排序/排行可以通过聚合函数rank() 和 dense_rank() 来实现。 rank() 和 dense_rank() : --两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应函数:dense_rank,rank dense_rank与ran…...