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

【C++】类和对象(一)

前言

类和对象第一部分知识包括定义访问限定符类域实例化this指针

本人其他文章:恋风诗
文章中的源码[gitte]:mozhengy

类和对象(一)

    • 前言
    • 1. 类的定义
      • 引例
      • 1.1 类定义格式
      • 1.2 类的访问限定符
      • 1.3 类域
    • 2. 实例化
      • 2.1 实例化概念
      • 2.2 对象大小
    • 3. this指针
    • 4.C++和C语言实现Stack对比
    • 总结

1. 类的定义

引例

C语言中我们学习了结构体struct,struct中可以定义变量,如之前学的数据结构栈的定义

typedef struct Stack
{int *a;int top;int capacity;
}Stack;

在C++中,我们将结构体进一步升级,进一步拓展结构体的内容,不仅可以定义变量,还可以定义函数

struct Stack
{void Init(){a = (int*)malloc(sizeof(int) * 4);if (a == nullptr){perror("malloc error");return;}top = 0;capacity = 4;}int* a;int top;int capacity;
};

此时
在C++中,结构体的类型可以是struct Stack,也认可用Stack表示
同样定义结构体变量可以直接表示为Stack st1;

在C++中,类是类似struct的事物,类则是用class定义

1.1 类定义格式

class为定义类的关键字,Stack为类的名字,{}中为类的主体。

  • 类定义结束时后面分号不能省略。
  • 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
  • 这里的public和private称为类的访问限定符,(后文会详解)
  • 类的类型就是名字classname
class classname
{
public://成员函数int add(int a, int b){return a + b;}
private://成员变量int a;int b;
};

定义的两种方法
1.声明与定义不分离
定义在类面的成员函数默认为inline。 声明和定义全部放在类体中,在类体中定义成员函数,


class Stack
{
public:void Init(){//省略}
private:int* a;int top;int capacity;};

2.声明定义分离
这里会牵扯到新的知识——类域

  • 之前了解过C++的常见域中的全局域、局部域、命名空间域,类域是新的一种
  • 在类体外定义成员函数,需要使用类域名字加::加成员函数名字来指明函数属于哪一个类域,进而才能在类域外部定义成员函数
  • 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域Stack,就是知 道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include<iostream>
using namespace std;
class Stack
{
public:// 成员函数 void Init(int n = 4);
private:// 成员变量 int* array;size_t capacity;size_t top;
};
// 声明和定义分离,需要指定类域 
void Stack::Init(int n)
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}
int main()
{Stack st;st.Init();return 0;
}

  • 有时我们命名的变量会和函数的形参冲突,因此为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ 或者 m 开头,注意C++中这个并不是强制的,只是一些惯例,具体看学校和公司的要求。
class Date
{
public:void Init(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _day;int _month;int _year;
};

1.2 类的访问限定符

• C++一种实现封装的方式,用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限 选择性的将其接口提供给外部的用户使用。
具体如下

类的访问限定符
public
公开
private
私有
protected
保护
访问权限
类内/类外均可访问
访问权限
仅类内可访问
访问权限
类内可访问
其他规则
默认访问权限
class 默认 private
struct 默认 public

由于继承等内容未学习,后续会补充
• 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有 访问限定符,作用域就到 }即类结束。
• 一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

1.3 类域

上面提到过,下面再说一下
类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作 用域操作符指明成员属于哪个类域。
• 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域Stack,就是知 道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。

#include<iostream>
using namespace std;class Stack
{public:// 成员函数void Init(int n = 4);private:// 成员变量int* array;size_t capacity;size_t top;
};// 声明和定义分离,需要指定类域
void Stack::Init(int n)
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}int main()
{Stack st;st.Init();return 0;
}

2. 实例化

2.1 实例化概念

  • 用类类型在物理内存中创建对象的过程,称为类实例化出对象。

  • 类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,用类实例化出对象时,才会分配空间。

  • 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,设计图规划了有多 少个房间,房间大小功能等,但是并没有实体的建筑存在,也不能住人,用设计图修建出房子,房子才能住人。

  • 同样类就像设计图一样,不能存储数据,实例化出的对象分配物理内存存储数据。

  • 一个类可以实例化处多个对象,实例化出的对象分配实际的物理空间去存储成员变量
    下面是实例化的例子

#include <iostream>
using namespace std;
class Date {
public:void Init(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print() {cout << _year << "/" << _month << "/" << _day <<endl;}
private:int _year;int _month;int _day;
};int main() {Date d1, d2;d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

但在这个例子中我们将private屏蔽掉,即默认访问成员变量的权限变为public,但是你仍然不可以使用域访问限定符::去访问类中的成员变量,因为类并没有实际分配内存空间去存储成员变量,按照上面的例子,你拿出一张房子的设计图,不是把房子举起来

//这种写法是错误的!!!!!!
#include <iostream>
using namespace std;
class Date {
public:void Init(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print() {cout << _year << "/" << _month << "/" << _day <<endl;}
//private:int _year;int _month;int _day;
};
int main()
{Date::_day;return 0;
}

会有以下报错

2.2 对象大小

类实例化出的每个对象,都有独立的数据空间,所以对象中肯定包含 成员变量,那么成员函数是否包含呢?首先函数被编译后是一段指令,对象中没办法存储,这些指令 存储在一个单独的区域(代码段),那么对象中非要存储的话,只能是成员函数的指针。
对象中是否有存储指针的必要呢,Date实例化d1和d2两个对象,d1和d2都有各自独立的成员变量 _year/_month/_day存储各自的数据,但是d1和d2的成员函数Init/Print指针却是一样的,存储在对象 中就浪费了。
如果用Date实例化100个对象,那么成员函数指针就重复存储100次,太浪费了。
C++规定类实例化的对象也要符合内存对齐的规则。
内存对齐规则

  • 第一个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  • 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
  • VS中默认的对齐数为8
  • 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小 就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
  • 对于有一个至多个成员函数的类对象的计算规则同结构体的内存对齐计算规则,
  • 对于一个都没有成员函数的类对象,编译器默认为它分配1字节的空间,这是为了占位,并不存储有效数据,确保由它实例化出的对象存在
#include<iostream>
using namespace std;
// 计算⼀下A/B/C实例化的对象是多⼤? 
class A
{
public:void Print(){cout << _ch << endl;}
private:char _ch;int _i;
};
class B
{
public:void Print(){//...}
};
class C
{
};
int main()
{A a;B b;C c;cout << sizeof(a) << endl;cout << sizeof(b) << endl;cout << sizeof(c) << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

3. this指针

  • Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这里就要看到C++给了 一个隐含的this指针解决这里的问题
  • 编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类类型的指针,叫做this 指针。比如Date类的Init的真实原型为,void Init(Date* const this, int year, int month, int day)
  • 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值,this->_year = year;
  • C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会报错),但是可以在函数体内显 示使用this指针。
#include<iostream>
using namespace std;class Date
{
public:// void Init(Date* const this, int year, int month, int day)void Init(int year, int month, int day){// 编译报错:error C2106: “=”: 左操作数必须为左值// this = nullptr;// this->_year = year;_year = year;this->_month = month;this->_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:// 这里只是声明,没有开空间int _year;int _month;int _day;
};int main()
{// Date类实例化出对象d1和d2Date d1;Date d2;// d1.Init(&d1, 2024, 3, 31);d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

4.C++和C语言实现Stack对比

面向对象三大特性:封装、继承、多态,下面的对比我们可以初步了解一下封装。
通过下面两份代码对比,我们发现C++实现Stack形态上还是发生了挺多的变化,底层和逻辑上没啥变 化。
C++中数据和函数都放到了类里面,通过访问限定符进行了限制,不能再随意通过对象直接修改数 据,这是C++封装的一种体现,这个是最重要的变化。这里的封装的本质是一种更严格规范的管 理,避免出现乱访问修改的问题。当然封装不仅仅是这样的,我们后面还需要不断的去学习。 C++中有一些相对方便的语法,比如Init给的缺省参数会方便很多,成员函数每次不需要传对象地 址,因为this指针隐含的传递了,方便了很多,使用类型不再需要typedef用类名就很方便

C实现Stack代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;void STInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}void STDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = ps->capacity = 0;
}void STPush(ST* ps, STDataType x)
{
assert(ps);
// 满了, 扩容
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
return;
}
ps->a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}bool STEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}void STPop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
ps->top--;
}STDataType STTop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps->a[ps->top - 1];
}int STSize(ST* ps)
{
assert(ps);
return ps->top;
}int main()
{
ST s;
STInit(&s);
STPush(&s, 1);
STPush(&s, 2);
STPush(&s, 3);
STPush(&s, 4);
while (!STEmpty(&s))
{
printf("%d\n", STTop(&s));
STPop(&s);
}
STDestroy(&s);
return 0;
}

C++实现Stack代码

#include<iostream>
using namespace std;typedef int STDataType;
class Stack
{
public:
// 成员函数
void Init(int n = 4)
{
_a = (STDataType*)malloc(sizeof(STDataType) * n);
if (nullptr == _a)
{
perror("malloc申请空间失败");
return;
}
_capacity = n;
_top = 0;
}void Push(STDataType x)
{
if (_top == _capacity)
{
int newcapacity = _capacity * 2;
STDataType* tmp = (STDataType*)realloc(_a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
return;
}
_a = tmp;
_capacity = newcapacity;
}
_a[_top++] = x;
}void Pop()
{
assert(_top > 0);
--_top;
}bool Empty()
{
return _top == 0;
}int Top()
{
assert(_top > 0);
return _a[_top - 1];
}void Destroy()
{
free(_a);
_a = nullptr;
_top = _capacity = 0;
}private:
// 成员变量
STDataType* _a;
size_t _capacity;
size_t _top;
};int main()
{
Stack s;
s.Init();
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
while (!s.Empty())
{
printf("%d\n", s.Top());
s.Pop();
}
s.Destroy();
return 0;
}

总结

内容虽然冗余,无奈想做的详细,因为C++已经有点困难了,同时本文尝试用mermaid画思维导图,如果感觉挺好以后继续用,若有错误还望多多指正。

相关文章:

【C++】类和对象(一)

前言 类和对象第一部分知识包括定义访问限定符类域实例化this指针 本人其他文章&#xff1a;恋风诗 文章中的源码[gitte]&#xff1a;mozhengy 类和对象&#xff08;一&#xff09; 前言1. 类的定义引例1.1 类定义格式1.2 类的访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 …...

【Vue】Vue3源码解析与实现原理

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Vue 3 架构概览1.1 模块化设计1.2 整体流程 2. 响应式系统2.1 响应式原理2.2 ref 和 reactive2.3 依赖收集与触发更新 3. 渲染系统3.1 虚拟DOM设计3.2 渲染管线3.3 Patch算法与Diff优化 4. 组件系统4.1 组件创建…...

黑马点评day02(缓存)

2、商户查询缓存 2.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…...

数据库MySQL学习——day9(聚合函数与分组数据)

文章目录 1. 聚合函数1.1 COUNT() 函数1.2 SUM() 函数1.3 AVG() 函数1.4 MIN() 函数1.5 MAX() 函数 2. GROUP BY 子句2.1 使用 GROUP BY 进行数据分组2.2 结合聚合函数 3. HAVING 子句3.1 使用 HAVING 过滤分组数据3.2 HAVING 和 WHERE 的区别 4. 实践任务4.1 创建一个销售表4.…...

为React组件库引入自动化测试:从零到完善的实践之路

为什么我们需要测试&#xff1f; 我们的ReactTypeScript业务组件库已经稳定运行了一段时间&#xff0c;主要承载各类UI展示组件&#xff0c;如卡片、通知等。项目初期&#xff0c;迫于紧张的开发周期&#xff0c;我们暂时搁置了自动化测试的引入。当时团队成员对组件逻辑了如指…...

数据结构——算法复杂度

一、数据结构定义 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c;如&#xff1a;线性表、树、图、哈希…...

Vue3响应式原理那些事

文章目录 1 响应式基础:Proxy 与 Reflect1.1 Proxy 代理拦截1.2 Reflect 确保 `this` 指向正确1.2.1 修正 `this` 指向问题1.2.2 统一的操作返回值1.3 与 Vue2 的对比2 依赖收集与触发机制2.1 全局依赖存储结构:WeakMap → Map → Set2.2 依赖收集触发时机2.3 依赖收集核心实…...

记9(Torch

目录 1、Troch 1、Troch 函数说明举例torch.tensor()torch.arange()创建张量创建一个标量&#xff1a;torch.tensor(42)创建一个一维张量&#xff1a;torch.tensor([1, 2, 3])创建一个二维张量&#xff1a;torch.tensor([[1, 2], [3, 4]])生成一维等差张量&#xff1a;语法&am…...

机器学习模型训练模块技术文档

一、模块结构概览 import numpy as np from sklearn.model_selection import cross_validate, learning_curve from sklearn.pipeline import make_pipeline from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing imp…...

健康养生:从微小改变开始

养生不必大刀阔斧&#xff0c;几个微小改变&#xff0c;就能让健康慢慢扎根生活。晨起别急着洗漱&#xff0c;先花 5 分钟靠墙站立&#xff0c;拉伸脊柱、调整体态&#xff0c;唤醒身体。早餐把白米粥换成杂粮粥&#xff0c;搭配水煮蛋和一小碟凉拌黄瓜&#xff0c;营养更全面。…...

某信服EDR3.5.30.ISO安装测试(二)

一、物理机启动EDR 1、修复dracut 使用DiskGenius克隆虚拟磁盘到物理磁盘&#xff0c;将虚拟机移植到物理机&#xff0c;因为磁盘UUID变化等原因&#xff0c;首次默认启动失败&#xff0c;提示&#xff1a; Starting Dracut Emergency Shell... Warning:/dev/centos/root doe…...

Leetcode:回文链表

1、题目描述 给定一个链表的 头节点 head &#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 示例 1&#xff1a; 输入: head [1,2,3,3,2,1] 输出: true 示例 2&#xff1a; 输入: head [1,2] 输出: …...

IL2CPP 技术深度解析

IL2CPP 是 Unity 开发的高性能脚本后端&#xff0c;它将 .NET 的中间语言 (IL) 转换为 C 代码&#xff0c;再编译为原生平台二进制文件。以下是 IL2CPP 的全面技术剖析。 一、架构设计原理 1. 整体编译流程 C# 源代码 → Roslyn 编译器 → IL (.NET DLL)→ IL2CPP 转换器 →…...

AI图片修复工具,一键操作,图片更清晰!

泛黄的老相册里藏着一座记忆博物馆&#xff0c;每张照片都是时光长河中的琥珀。祖父军装照上的折痕里藏着抗美援朝的故事&#xff0c;父母结婚照褪色的红唇映照着八十年代的风尚&#xff0c;童年抓拍照上模糊的身影正重演着我们成长的轨迹。这些承载着集体记忆的影像&#xff0…...

国内短剧 vs. 海外短剧系统:如何选择?2025年深度对比与SEO优化指南

在短剧市场爆发式增长的背景下&#xff0c;国内与海外短剧系统成为创业者与企业的热门选择。本文将从市场潜力、开发成本、内容创作、盈利模式及风险五大维度&#xff0c;结合最新行业数据与案例&#xff0c;深度解析两者的优劣势&#xff0c;助您做出最优决策。 一、市场前…...

linux crash工具详解

crash 是 Linux 系统中用于分析内核转储文件&#xff08;如 vmcore 或 kdump 生成的 dump 文件&#xff09;的核心工具。它结合了调试符号和内核数据结构&#xff0c;能够直观地查看崩溃时的系统状态。以下是其详细使用方法及核心功能解析&#xff1a; 一、安装与准备 1. 安装…...

Scala day6(Class,field,Single Object)

Foreword【こんにちは】 Today, we continue to learn Scala Language, though the Scala isn’t easy for Begainner, Big Data Technology need Scala Language, Spark【Distributed Calculation FrameWork】is based on Scala Language designed. I know the learning road…...

不小心把当前的环境变量路径覆盖掉怎么办

起因 配置环境变量&#xff08;~/.bashrc&#xff09;的时候没加:$PATH&#xff0c;导致 source ~/.bashrc之后只剩下刚刚配置的环境变量了。连vim都打不开 解决 添加临时环境变量export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH再重新修改…...

unity TMP字体使用出现乱码方框

参考文章&#xff1a; Unity 设置默认字体&#xff08;支持老版及新版TMP&#xff09;_unity tmp字体-CSDN博客 原因是导入的项目package包没有连着tmp一起&#xff0c;这样在新工程中导入的tmp字体默认的是tmp自己的&#xff0c;解决方案就是替换成自己需要的tmp字体就行 替换…...

14.网络钓鱼实战

网络钓鱼实战 第一部分&#xff1a;网络钓鱼攻击详解第二部分&#xff1a;设计与分析钓鱼攻击第三部分&#xff1a;钓鱼攻击防范实践总结 目标: • 深入理解网络钓鱼攻击的实施过程 • 掌握设计和识别钓鱼攻击的技巧 • 通过模拟实践提升防范钓鱼攻击的能力 第一部分&#xf…...

pyqt写一个单片机配置界面

已经实现以下功能 1.可以选择单片机架构 2.选择完单片机架构后第二个框可以选择常见单片机型号 3.选择完常见单片机型号后第三个框可以选择内部资源如adc等&#xff08;可以选择多个内部资源&#xff09;4.选择完内部资源如adc等&#xff08;可以选择多个内部资源&#xff09;后…...

「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例

一、概述 本篇介绍如何在工作流中使用结构化输出字段作为判断依据&#xff0c;实现前后节点联动控制。通过执行 LLM 节点输出结构化 JSON&#xff0c;并使用其中的字段驱动后续判断节点执行不同路径&#xff0c;开发人员将掌握结构化字段在工作流中的引用方式与分支控制技巧。…...

Unity-Shader详解-其四

今天我们来聊Unity特有的表面着色器以及很少提到的几何着色器。 表面着色器 在前文关于光照的计算中&#xff0c;我们学会了很多&#xff1a;我们学习了一系列光照模型&#xff0c;比如专门针对漫反射的兰伯特模型和改进的半兰伯特模型&#xff0c;又比如由高光、漫反射和环境…...

Lua 元表和元方法

元表(Metatable)和元方法(Metamethod)是Lua中实现面向对象编程、操作符重载和自定义行为的重要机制。 元表 元表是一个普通的Lua表&#xff0c;可以附加到另一个表上&#xff0c;用于定义或修改该表的行为。每个表都可以有自己的元表。 setmetatable(tab,metatab) 将metatab设…...

GESP2024年3月认证C++八级( 第二部分判断题(6-10))

海伦公式参考程序&#xff1a; #include <iostream> #include <cmath> // 引入cmath库以使用sqrt函数using namespace std;double calculateTriangleArea(int a, int b, int c) {// 使用海伦公式double s (a b c) / 2.0; // 半周长return sqrt(s * (s - a) *…...

Nacos源码—3.Nacos集群高可用分析一

大纲 1.Nacos集群的几个问题 2.单节点对服务进行心跳健康检查和同步检查结果 3.集群新增服务实例时如何同步给其他节点 4.集群节点的健康状态变动时的数据同步 5.集群新增节点时如何同步已有服务实例数据 1.Nacos集群的几个问题 问题一&#xff1a;在单机模式下&#xff…...

信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(九)

个人笔记整理---仅供参考 第九章项目范围管理 9.1管理基础 9.2项目范围管理过程 9.3规划范围管理 9.4收集需求 9.5定义范围 9.6创建WBS 9.7确认范围 9.8控制范围...

DeepSeek学术论文写作全流程指令

一、选题与领域界定 研究热点捕捉 指令: “在[研究领域]中,现有文献对[具体问题]的[哪方面]研究不足?基于近5年文献归纳3个待突破方向,需结合高频关键词和交叉学科维度。” 示例: “在深度学习医疗影像分析中,现有文献对小样本训练的泛化性研究不足?基于2019-2023年顶会…...

【ArUco boards】标定板检测

之前定位用的Charuco标定板做的&#xff08;https://blog.csdn.net/qq_45445740/article/details/143897238&#xff09;&#xff0c;因为实际工况中对标定板的尺寸有要求&#xff0c;大概是3cm*2cm这个尺寸&#xff0c;加上选用的是ChAruco标定板&#xff0c;导致每一个aruco码…...

2025 年 408 真题及答案

2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题&#xff0c;符号栈…...

设计模式每日硬核训练 Day 18:备忘录模式(Memento Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 17&#xff1a;中介者模式小结 在 Day 17 中&#xff0c;我们学习了中介者模式&#xff08;Mediator Pattern&#xff09;&#xff1a; 用一个中介者集中管理对象之间的通信。降低对象之间的耦合&#xff0c;适用于聊天系统、GUI 控件联动、塔台调度等…...

ByteArrayOutputStream 类详解

ByteArrayOutputStream 类详解 ByteArrayOutputStream 是 Java 中用于在内存中动态写入字节数据的输出流(ByteArrayOutputStream和ByteArrayInputStream是节点流),位于 java.io 包。它不需要关联物理文件或网络连接,所有数据都存储在内存的字节数组中。 1. 核心特性 内存缓冲…...

Linux中web服务器的部署及优化

前言&#xff1a;Nginx 和 Apache HTTP Server 是两款非常流行的 Web 服务器。 Nginx 简介&#xff1a;Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。由俄罗斯人伊戈尔・赛索耶夫开发&#xff0c;其在处…...

使用Mathematica绘制Sierpinski地毯

在Mathematica中内置的绘制Sierpinski地毯的函数&#xff1a; SierpinskiCurve[n] gives the line segments representing the n-step Sierpiński curve. 注意&#xff0c;直接运行这个函数&#xff0c;返回的是Line对象&#xff0c;例如&#xff1a; 运行如下代码&#xf…...

Qt 信号槽机制底层原理学习

简介 Qt的信号和槽&#xff08;Signals and Slots&#xff09;是Qt开发团队创造的一种特殊回调机制&#xff0c;提供了非常简洁易用的事件触发-函数调用机制。 原理学习 虽然上层使用简单&#xff0c;但底层实现机制却复杂的不得了&#xff0c;这里简单的学习一下大概原理。…...

【Java学习笔记】包

包&#xff08;package&#xff09; 包的本质&#xff1a;实际上就是创建不同的文件夹或者目录来保存类文件 包的三大作用 区分相同名字的类 当类很多的时候可以更方便的管理类 控制访问范围 使用方法 关键字&#xff1a;import—>导入&#xff08;引入&#xff09; …...

进程的程序替换——exec系列函数的使用

目录 前言 一、替换函数 二、程序替换的本质 一些细节&#xff1a; 三、程序替换与环境变量间的关系 1.介绍其他参数的意义并总结 2.自定义环境变量 1&#xff09;通过execcle传参全局环境变量 2&#xff09;通过execcle传参自定义环境变量 3&#xff09;将自定义环境变量通过p…...

【论文阅读】DETR+Deformable DETR

可变形注意力是目前transformer结构中经常使用的一种注意力机制&#xff0c;最近补了一下这类注意力的论文&#xff0c;提出可变形注意力的论文叫Deformable DETR&#xff0c;是在DETR的基础上进行的改进&#xff0c;所以顺带着把原本的DETR也看了一下。 一、DETR DETR本身是…...

ArchLinux卡死在GRUB命令行模式修复

ArchLinux卡死在GRUB命令行模式修复 文章目录 ArchLinux卡死在GRUB命令行模式修复前言一、 系统配置1.系统配置2.磁盘分区信息 二、重建GRUB引导1.插入带ArchLinux ISO的U盘&#xff0c;BIOS选择U盘启动并进入ArchLinux安装界面。2.挂载btrfs根目录分区3.挂载/boot分区4.进入ch…...

Docker 容器 - Dockerfile

Docker 容器 - Dockerfile 一、Dockerfile 基本结构二、Dockerfile 指令详解2.1 FROM2.2 MAINTAINER2.3 COPY2.4 ADD2.5 WORKDIR2.6 VOLUME2.7 EXPOSE2.8 ENV2.9 RUN2.10 CMD2.11 ENTRYPOINT 三、Dockerfile 创建镜像与模板3.1 Dockerfile 镜像3.2 镜像管理3.3 Dockerfile 模板…...

C++ 中二级指针的正确释放方法

C 中二级指针的正确释放 一、什么是二级指针&#xff1f; 简单说&#xff0c;二级指针就是指向指针的指针。 即&#xff1a; int** p;它可以指向一个 int*&#xff0c;而 int* 又指向一个 int 类型的变量。 常见应用场景 动态二维数组&#xff08;例如 int** matrix&#x…...

解释器模式(Interpreter Pattern)

解释器模式&#xff08;Interpreter Pattern&#xff09; 是行为型设计模式之一&#xff0c;通常用于处理“语言”类问题&#xff0c;比如计算器、编程语言的解析等。它的核心思想是通过建立一个解释器&#xff0c;解析并解释由语法规则描述的语言&#xff0c;通常以**抽象语法…...

编译原理期末重点-个人总结——1 概论

概述 计算机语言的分类 低级语言&#xff1a;机器语言&#xff08;唯一能被计算机执行的&#xff09;&#xff0c;汇编语言 高级语言&#xff1a;JAVA &#xff0c;C 执行高级语言或汇编语言的步骤 高级语言程序或汇编语言程序> &#xff08;通过解释 或 翻译&#xff09;转…...

五一作业-day04

文章目录 1. **ps -ef是显示当前系统进程的命令,统计下当前系统一共有多少进程**2. **last命令用于显示所用用户最近1次登录情况,awk可以取出某一列,现在要取出last命令第1列并去重统计次数**3. **secure日志是用户的登录日志,过滤出secure日志中的Failed password的次数(用课堂…...

Java按字节长度截取字符串指南

在Java中&#xff0c;由于字符串可能包含多字节字符(如中文)&#xff0c;直接按字节长度截取可能会导致乱码或截取不准确的问题。以下是几种按字节长度截取字符串的方法&#xff1a; 方法一&#xff1a;使用String的getBytes方法 java public static String substringByBytes(…...

[特殊字符]Git 操作实战:如何将本地项目提交到远程 Gitee 仓库

在日常开发中&#xff0c;我们经常需要将本地开发的项目同步到远程代码仓库中&#xff08;如 GitHub、Gitee 等&#xff09;&#xff0c;以便团队协作或备份管理。本文将以 Gitee&#xff08;码云&#xff09; 为例&#xff0c;详细讲解如何将本地已有项目提交到远程仓库&#…...

【信息系统项目管理师-论文真题】2008上半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题1:企业级信息系统项目管理体系的建立1、写作要点2、解题思路项目管理流程和项目管理的工具试题2:项目的质量管理1、写作要点2、解题思路项目的早期阶段如何制定项目质量管理计划如何确保项目质量管理计划…...

C语言|函数的递归调用

函数的递归调用 (逐层分解&#xff0c;逐层合并) 自己调用自己&#xff0c;必须要知道什么时候停止调用&#xff0c;不然会造成电脑死机。 【知识点】 1 函数调用是通过栈实现的。 多个函数嵌套调用时&#xff0c;会按照先调用后返回的原则进行返回。 2 函数递归必须满足的两…...

QT 在圆的边界画出圆

QT 在圆的边界画出圆 QT 在圆的边界画出实心圆 在Qt中&#xff0c;要实现在圆的边界上绘制图形&#xff0c;你需要使用QPainter类来在QWidget或其子类的paintEvent中绘制。下面我将通过一个简单的例子来说明如何在Qt中绘制一个圆&#xff0c;并在其边界上绘制其他图形&#x…...

Guass数据库实验(数据字典设计、交叉表设计)

Assignment 2: Database Design 目录 Assignment 2: Database Design 数据库创建 新建用户bit&#xff0c;并创建数据库模式ass2 使用datastdui以该用户远程登陆 创建学科数据字典相关表 学科门类表 一级学科表 二级学科表 三级学科表 学科变更历史表 插入数据字典…...