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等引擎加载进行三维可视化、语义查询、专题分析&…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
