【C++ 学习 ②】- 类和对象(上)
目录
一、 面向对象的基本理念
1.1 - 什么是对象?
1.2 - 类和对象
1.3 - 面向对象的五条原则
1.4 - 面向过程 vs 面向对象
二、C++ 中的结构体
三、类的定义
3.1 - 类的两种定义方式
3.2 - 成员变量的命名规范
四、类的访问限定符和封装
4.1 - 访问限定符
4.2 - 封装
五、类的实例化
六、类的存储方式
七、this 指针
7.1 - this 指针的引入
7.2 - this 指针的特性
7.3 - 练习
参考资料:
浙江大学 C++ 翁恺老师。
【C++】什么是对象?什么是类?_c++ 里的 对象定义。
面向过程 VS 面向对象 - 知乎 (zhihu.com)。
一文带你入门C++类和对象【十万字详解,一篇足够了】。
一、 面向对象的基本理念
1.1 - 什么是对象?
-
Object = Entity
-
Object may be visible or invisible.
-
Object is variable in programming languages.
在现实世界中,任何事物都是对象。
它可以是有形的具体存在的事物,例如一张凳子、一台电脑、一个学生、一辆汽车等,也可以是无形的抽象的事物,例如一次演出、一场球赛等。
在程序设计语言中,对象实际上就是变量。
-
Objects = Atrributes + Services
Data: the properties or status
Operations: the functions
对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
例如,一个学生就是一个对象,学生的学号、姓名和成绩等数据就是他的属性,输入或输出学号、姓名和成绩等就是对数据施加的一组操作。
-
Object send and receive messages(objects do things!)
Messages are
—Composed by the sender
—Interpreted by the receiver
—implemented by the methods
Message
—May cause receiver to change state
—May return results
每个对象都有自己的属性和行为,对象和对象之间通过方法来交互。
1.2 - 类和对象
-
Objects(cat)
Represent things, events, or concepts
Respond to messages at run-time
-
Classes(cat class)
Define properties of instances
Act like types in C++
类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。
1.3 - 面向对象的五条原则
-
Everything is an object.
-
A program is a bunch of objects telling each other what to do by sending messages.
-
Each objects has its own memory made up of other objects.
-
Every object has a type.
-
All objects of a particular type can receive the same messages.
第五条原则可以分别两个方面来理解。从正面理解,即一个特定类型的所有对象可以接受相同的消息;从反面理解,即所有可以接受相同消息的对象可以被认为是同一类型。
1.4 - 面向过程 vs 面向对象
面向过程(Procedure Oriented,简称 PO)是以 "事件" 为中心的编程思想,编程的时候首先把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
以五子棋为例,面向过程的设计思路是首先分析解决这个问题的步骤,即:
(1) 开始游戏 (2) 黑子先走 (3) 绘制画面 (4) 判断输赢 (5) 白子再走 (6) 绘制画面 (7) 判断输赢 (8) 返回步骤(2) (9) 输出最后结果
然后用函数实现上面一个一个的步骤,在一步一步的具体步骤中再按顺序调用函数。
面向对象(Object Oriented,简称 OO)是一种以 "对象" 为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在整个解决问题的步骤中的属性和行为。
在五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:
(1) 黑白双方,这两方的行为是一样的
(2) 棋盘系统,负责绘制画面
(3) 规则系统,负责判定犯规、输赢等
然后赋予每个对象一些属性和行为:
第一类对象(黑白双方)负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化,棋盘系统接受到了棋子的变化,并负责在屏幕上显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
二、C++ 中的结构体
C 结构体中只能包含成员变量,而 C++ 结构体的成员不仅可以是变量,还可以是函数。
C doesn't support the relationship between data and functions.
用 C 和 C++ 分别实现栈时,Stack.h
中的内容分别应该是:
<C 版本>:
#pragma once
#include <stdbool.h>
// 动态顺序栈
typedef int STDataType;
typedef struct Stack
{STDataType* data;int top;int capacity;
}Stack;
// 基本操作
void StackInit(Stack* pst, int default_capacity); // 初始化
bool StackEmpty(Stack* pst); // 判断是否为空栈
void StackPush(Stack* pst, STDataType x); // 入栈
void StackPop(Stack* pst); // 出栈
STDataType StackTop(Stack* pst); // 返回栈顶元素
int StackSize(Stack* pst); // 返回栈的有效元素个数
void StackDestroy(Stack* pst); // 销毁
<C++ 版本>:
#pragma oncetypedef int STDataType;
struct Stack
{
public:void Init(int default_capacity = 5); // 初始化bool Empty(); // 判断是否为空栈void Push(const STDataType& x); // 入栈void Pop(); // 出栈STDataType Top(); // 返回栈顶元素int Size(); //返回栈的有效元素个数void Destroy(); // 销毁
private:STDataType* _data;int _top;int _capacity;
};
问题:
public adj. 公开的;private adj. 私密的
这两个关键字的作用是什么(大概可以知道,该结构体仅公开对外的接口,而隐藏内部的数据)?
成员变量名前面为什么要加一个下划线(
_
)?在 C++ 中更喜欢用关键字 class 来代替 struct,那么 struct 和 class 的异同是什么?
成员函数又该如何定义?
三、类的定义
语法格式:
class className
{// 类的成员,包括成员函数(类的方法)和成员变量(类的属性)
}; // 分号不能省略
3.1 - 类的两种定义方式
在 C++ 中,通常用一个 .h
和一个 .cpp
文件定义一个类(例如 Stack.h
和 Stack.cpp
)。① 声明放在 .h
文件中,成员函数定义则放在 .cpp
文件中。
由于类定义了一个新的作用域,即类作用域,所以在类体外定义成员函数,需要加作用域。例如:
Stack.cpp
:
#include "Stack.h"
#include <stdlib.h>
#include <assert.h>
// 初始化
void Stack::Init(int default_capacity)
{_data = (STDataType*)malloc(sizeof(STDataType) * default_capacity);if (nullptr == _data){perror("initialization failed!");exit(-1);}_top = 0;_capacity = default_capacity;
}
// 判断是否为空栈
bool Stack::Empty()
{return _top == 0;
}
// 入栈
void Stack::Push(const STDataType& x)
{if (_top == _capacity){STDataType* tmp = (STDataType*)realloc(_data, sizeof(STDataType) * 2 * _capacity);if (nullptr == tmp){perror("realloc failed!");return;}_data = tmp;_capacity *= 2;}_data[_top++] = x;
}
// 出栈
void Stack::Pop()
{assert(!Empty()); // 前提是栈非空--_top;
}
// 返回栈顶元素
STDataType Stack::Top()
{assert(!Empty()); // 前提是栈非空return _data[_top - 1];
}
//返回栈的有效元素个数
int Stack::Size()
{return _top;
}
// 销毁
void Stack::Destroy()
{free(_data);_data = nullptr;_top = _capacity = 0;
}
② 成员函数的定义也可以放在类体中,此时编译器可能会将其当成内联函数处理。
3.2 - 成员变量的命名规范
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){year = year;month = month;day = day;}void Display(){cout << year << "-" << month << "-" << day << endl;}
private:int year;int month;int day;
};
int main()
{Date d;d.Init(2023, 5, 1);d.Display(); // 随机值(说明初始化失败)return 0;
}
由此可以发现,当成员变量和形参同名时,是无法完成初始化的。类似于:
#include <iostream>
using namespace std;
int g_val = 10;
int main()
{int g_val = 20;g_val = g_val; // 该语句并不会将全局变量 g_val 的值赋值给局部变量 g_valcout << g_val << endl; // 20return 0;
}
解决方案如下:
class Date
{
public:void Init(int year, int month, int day){// 一、加作用域/*Date::year = year;Date::month = month;Date::day = day;*/// 二、使用 this 指针(后面会详解)/*this->year = year;this->month = month;this->day = day;*/// 三、对成员变量名进行修改_year = year;_month = month;_day = day;}void Display(){cout << year << "-" << month << "-" << day << endl;}
private:int _year; // 或者 mYear, m 即 memberint _month; // 或者 mMonthint _day; // 或者 mDay
};
四、类的访问限定符和封装
4.1 - 访问限定符
-
public 修饰的成员在类内和类外都可以直接被访问。
-
protected 和 private 修饰的成员在类外不能直接被访问(此处 protected 和 private 是类似的)。
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到
}
,即类结束。 -
class 的默认访问权限是 private,struct 为 public。
因为 C++ 要兼容 C,所以在 C++ 中 struct 可以当作结构体使用,也可以用来定义类,和用 class 定义类是一样的,区别在于 struct 定义的类的默认访问权限是 public,class 定义的类的默认访问权限是 private。
注意,在继承和模板参数列表位置,struct 和 class 也有区别,后续进行讲解。
4.2 - 封装
面向对象的三大特性:封装、继承和多态。
封装(encapsulation):将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
capsule n. 胶囊
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入、显示器、USB 插孔等,让用户和计算机进行交互,完成日常事物。但实际上工作的却是 CPU、显卡、内存等一些硬件原件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上路线是如何布局的,CPU 内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关、鼠标及键盘插孔等,让用户可以与计算机进行交互即可。
在 C++ 中实现封装,可以通过类将数据及操作数据的方法进行有机结合,通过访问权限来隐藏对象的属性和实现细节,控制哪些方法可以在类外直接被使用。
五、类的实例化
用类创建对象的过程,称为类的实例化。
-
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义一个类并没有分配实际的内存空间来存储它。
-
一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。
做个比方,类实例化对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
六、类的存储方式
类对象的存储方式猜测:
-
对象中包含类的各个成员:
显然,这种存储方式的一大缺陷在于,当创建多个对象时,每个对象的成员变量不同,但成员函数是相同的,因此会存在多份相同的代码,造成空间浪费。
-
相同的代码只保存一份,在对象中存放代码的地址:
-
只保存成员变量,成员函数存放在公共的代码段:
实际上是采用第三种存储方式。
#include <iostream>
using namespace std;
class A
{
public:void Init(char c1, int i, char c2);void Print();
private:char _c1;int _i;char _c2;
};
void A::Init(char c1, int i, char c2)
{_c1 = c1;_i = i;_c2 = c2;
}
void A::Print()
{cout << _c1 << " " << _i << " " << _c2 << endl;
}
int main()
{cout << sizeof(A) << endl; // 12(注意:存在内存对齐)return 0;
}
注意:对于只有成员函数的类和空类,
sizeof(classNmae)
为 1(编译器给一个字节来唯一标识这个类的对象)。
七、this 指针
7.1 - this 指针的引入
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;d1.Init(2023, 5, 1);d2.Init(2023, 5, 2);d1.Display(); // 2023-5-1d2.Display(); // 2023-5-2return 0;
}
问题:Date 类中有 Init
和 Display
两个成员函数,函数体中没有关于不同对象的区分,那么当 d1 调用 Init
和 Display
函数时,这两个函数是如何知道初始化和显示的对象是 d1,而不是其他,例如 d2,对象呢?
解答:C++ 编译器给每个 "非静态的成员函数" 增加一个隐藏的指针参数 this,让该指针指向当前对象(函数运行时调用该函数的对象)。在函数体中所有 "成员变量" 的操作,都是通过该指针去访问,只不过所有的操作对用户是透明的,即用户不需要传递,编译器自动完成。
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;// 可以在成员函数内部显示地使用 this 指针cout << "this = " << this << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;
cout << "&d1 = " << & d1 << endl;d1.Init(2023, 5, 1);// 输出的两个地址相同
cout << "&d2 = " << & d2 << endl;d2.Init(2023, 5, 2);// 输出的两个地址也相同return 0;
}
7.2 - this 指针的特性
-
this 为指针常量,即在成员函数中,不能改变 this 的指向。
-
this 指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参,所以对象中不存储 this 指针。
d1.Init(2023, 5, 1); // 可以视为 Date::Init(&d1, 2023, 5, 1); d1.Display(); // 可以视为 Date::Display(&d1); // 注意:不能显示地将对象的地址传递给 this 指针, // 所以 Date::Init(&d1, 2023, 5, 1); 和 Date::Display(&d1); 实际上是不被允许的
-
this 指针是成员函数第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传递,不需要用户传递。
7.3 - 练习
#include <iostream>
using namespace std;
class A
{
public:void f() {cout << "f()" << endl;}
private:int _i;
};
int main()
{A* pa = nullptr;pa->f(); return 0;
}
问:上面程序编译运行的结果是()?
编译报错
运行崩溃
正常运行
pa->f();
可以被视为A::f(pa);
,this 指针为空,但在函数内部没有对 this 指针进行解引用,所以并不会出现运行错误,而是正常输出 "f()"。
相关文章:
【C++ 学习 ②】- 类和对象(上)
目录 一、 面向对象的基本理念 1.1 - 什么是对象? 1.2 - 类和对象 1.3 - 面向对象的五条原则 1.4 - 面向过程 vs 面向对象 二、C 中的结构体 三、类的定义 3.1 - 类的两种定义方式 3.2 - 成员变量的命名规范 四、类的访问限定符和封装 4.1 - 访问限定符 …...
最好的物联网教程:软硬结合——从零打造物联网
在大学里不同专业有着不同的追求:机械类与强电类专业学生追求的是 “机电合一” ,既懂机械又懂电气,整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” ,既懂硬件又懂软件,整个电子产品便能打通。我作…...
猫狗训练集训练报错:Failed to find data adapter that can handle input
这里写自定义目录标题 Jupyter Notebook6.5.4 tensorflow 2.12.0 pillow 9.5.0 numpy 1.23.5 keras 2.12.0 报错详细内容: ValueError: Failed to find data adapter that can handle input: (<class ‘tuple’> containing values of types {“<class ‘k…...
中国网络安全人才需求
如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手,那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜,知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站…...
设计模式之组合模式
目录 1、组合模式的定义 2、组合模式例子 3、组合模式实现 3.1 组合模式的结构 3.2 组合模式的分类 3.3 组合模式代码实现(透明组合模式) 4、组合模式的优点 5、组合模式使用场景 1、组合模式的定义 组合模式又名部分整体模式,是用于把…...
计算机基础书籍
一操作系统 二常见问题总结 1.操作系统的特征? 并发、共享、虚拟、异步性 2.进程阻塞与唤醒的条件 等待 I/O 操作完成请求系统资源失败等待信号量或事件等待子进程结束被高优先级进程抢占 3.如何避免死锁? 1、避免资源竞争 2、破坏循环等待条件 3、优…...
保龄球游戏的获胜者、找出叠涂元素----2023/4/30
保龄球游戏的获胜者----2023/4/30 给你两个下标从 0 开始的整数数组 player1 和 player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。 保龄球比赛由 n 轮组成,每轮的瓶数恰好为 10 。 假设玩家在第 i 轮中击中 xi 个瓶子。玩家第 i 轮的价值为: …...
jQuery事件
1. jQuery事件注册 单个事件注册 语法: element.事件(function(){}) eg:$(“div”).click(function(){ 事件处理程序 }) 其他事件和原生基本一致。比如mouseover、mouseout、blur、focus、change、keydown、keyup、resize、scroll 等 <!DOCTYP…...
初识SpringCloud
一、软件架构演进 单体架构 垂直架构 分布式架构 SOA架构 微服务架构 二、微服务架构 2.1 微服务理念 "微服务”一词源 于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到http://martinfowler.com/articles/microservices.html微服务是系统架构上…...
安装java配置
目录 安装JDK 编辑 环境变量配置 3、检验环境变量配置 二、安装tomcat 验证Tomcat配置是否成功 三、安装Mysql 一、安装 二、卸载 四、安装Maven 安装JDK 点击更改将C直接给为F即可。 点击确定后进行安装,安装完以后会提示安装JRE; 检测是否已经安装JDK的…...
KBO的选秀会有哪些规定和流程`棒球7号位
KBO(韩国职业棒球联盟)的选秀会有以下规定和流程: 1. 选秀对象:KBO的选秀会主要面向年满18岁及以上的高中和大学生,以及海外球员和自由球员。KBO的球队可以在选秀会中挑选所需的球员,每个球队有一定数量的选…...
男子订民宿被毁约5个家庭漂泊街头 房东:住满了,没办法
据媒体报道,5月1日,一位叫做诸先生的消费者和朋友们提前在平台上预订了五一假期前往青岛金沙滩地中海两天的别墅民宿,并支付了房款9600元。 但是当他们到达目的地前一个半小时联系房东时,却发现联系不上人。到达指定地点后&#x…...
Vue快速入门,常用指令,生命周期
Vue常用指令 案例: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…...
【热门框架】Mybatis-Plus入门介绍看这一篇文章就足够了
MyBatis-Plus 是在 MyBatis 的基础上进行了封装,提供了更加便捷的开发方式,具有简化开发、提高效率等优点。以下是 MyBatis-Plus 的一些特点和用法: 通用 CRUD 操作:MyBatis-Plus 提供了通用的 CRUD 接口,可以直接调用…...
Node【Node.js 20】新特性
文章目录 🌟前言🌟Node.js 20: 一次重要的升级和改进🌟Internationalization API Update🌟端口管理器🌟字符串处理🌟 更好的调试工具🌟 Crypto模块的更新🌟总结🌟写在最后…...
前端程序员的职业发展规划与路线——ChatGPT的回答
文章目录 一、前端程序员的职业规划是?回答1: 作为一个前端开发程序员,您的职业发展路线可能如下:回答2:作为前端开发程序员,您的职业发展路线可能如下:回答3: 你的职业发展路线可能…...
AlgoC++第八课:手写BP
目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C,链接。记录下个人学习笔记,仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…...
【Java笔试强训 27】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥 不用加…...
java紫砂壶交易购物系统 mysql
网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传,大大达到了陶瓷业的“色型”要求。实现产品管理方便,起到立竿见影的效果,不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点,全线马上更新。采用B/S模式&#x…...
7-4 多态练习-计算面积
定义三个类,父类(抽象类)GeometricObject代表几何形状,子类Circle代表圆形,子类Rectangle代表矩形。具体属性和方法如下: 父类 (抽象类)GeometricObject 属性: private String color; private S…...
很佩服的一个Google大佬,离职了。。
这两天,科技圈又有一个突发的爆款新闻相信不少同学都已经看到了。 那就是75岁的计算机科学家Geoffrey Hinton从谷歌离职了,从而引起了科技界的广泛关注和讨论。 而Hinton自己也证实了这一消息。 提到Geoffrey Hinton这个名字,对于一些了解过…...
【Python习题集1】Python 语言基础知识
python习题 一、实验内容二、实验总结 一、实验内容 1、运用输入输出函数编写程序,将华氏温度转换成摄氏温度。换算公式:C(F-32)*5/9,其中C为摄氏温度,F为华氏温度。 (1)源代码: ffloat(input(输入华氏温…...
C语言进阶——数据在内存中的存储,你知道吗?
今天我们深度剖析数据在内存中的存储: 重点知识: 1、数据类型详细介绍 2、整形在内存中的存储:原码、反码、补码 3、大小端字节序介绍及判断 4、浮点型在内存中的存储解析 之前我们涉及关于这一部分的知识只是大致的进行讲解࿰…...
规则引擎----easy rules
一、规则引擎的作用 将复杂的if else判断剥离出来 二、使用 2.1、引入POM <!--easy rules核心库--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>3.3.0</version></depe…...
你手写过一把锁吗?你对轮询缓存怎么看?
当多个线程同时去操作一块内存的数据时如果不做一些限制,极其可能出现数据一致性问题。这时候,我们用一把锁锁住这块数据,持有钥匙者可以进入,不持有者等待钥匙用完再分配。所以在我看来啊,锁的本质就是一个标志位&…...
深入理解 spring-boot-starter-parent
目录 一、前言二、Maven继承三、分析spring-boot-starter-parent四、Maven单继承问题五、不继承spring-boot-starter-parent需要注意的 一、前言 在idea当中创建springboot项目的时候都会继承一个spring-boot-starter-parent作为父类,假如不继承我们的项目就不能使…...
基于SpringBoot的线上日志阅读器
软件特点 部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。 使用手册 基本页面 配置路径 配置日志所在的目录,配置后按回车…...
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
Leetcode Leetcode -405.数字转换为十六进制数Leetcode - 409.最长回文串 Leetcode -405.数字转换为十六进制数 题目:给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。 注意 : 十六进制中所有…...
剑指 Offer:003 前 n 个数字二进制中 1 的个数
题目: 给定一个非负整数 n,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组 示例: 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …...
DDD系列:二、应用架构设计演变
作用: 通过规定一个固定的架构设计,可以让团队内有一个统一的开发规范,降低沟通成本,提升效率和代码质量。 目标: 在做架构设计时,一个好的架构应该需要实现以下几个目标: 独立于UI:前…...
做淘宝客的的网站有什么要求吗/seo教学平台
刚开始接触java的时候感觉要学习太多的东西了,而且听别人说很难,就有点畏惧感,可是慢慢的就感觉并没有那么难,和c语言有很多类似的地方,也有很多互通的知识,感觉慢慢去深入的学习java,还是可以一…...
礼县建设局网站/深圳网络推广培训中心
几句话掌握子网掩码、ip地址、主机号、网络号、网络地址、广播地址191.172.16.10.33/27 中的/27也就是说子网掩码是255.255.255.224 即27个全12.从子网掩码255.255.255.252得出其网络位为30位,所以只有剩下的2位为主机位,主机位全零的为网络地址…...
把自己的电脑做网站服务器/怎样推广网站
大家好,这篇文章跟大家来聊下 Spring 中提供的常用扩展点、Spring SPI 机制、以及 SpringBoot 自动装配原理,重点介绍下 Spring 基于这些扩展点怎么跟配置中心(Apollo、Nacos、Zookeeper、Consul)等做集成。 写在前面 我们大多数…...
用什么建网站/电商seo优化
Problem statement: Write a program in python (using matplotlib.pyplot) to create a scatter plot. 问题陈述:用python编写程序(使用matplotlib.pyplot)以创建散点图。 Use of scatter plot: Scatter plots are usually used to compare two variables (three…...
医院管理系统网站开发/成品网站1688入口网页版
正题第二题:[HNOI2003]操作系统我们看到了“优先级最高”这几个字,我们就想到了用堆来维护 bool operator<(const node y)const{if(ranky.rank) return begin>y.begin;return rank<y.rank; } 我们这样就可以来维护优先级高的在前面先做&#x…...
广州seo网站推广优化/今日头条新闻在线看
什么是索引覆盖就是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。那么显然select * from ...是一种拙劣的查询,除非你建立了包含所有列的索引(这样建索引脑子进水)。对 于…...