自己做的网站加入购物车价格/常州网站建设优化

设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。
【例1】 MyString类的对象作为CStudent类的数据成员。
1. //MyString类的定义省略
2. //注意:保留其构造函数、析构函数、复制构造函数和赋值运算符中的输出内容3. //file: student.h
4. #pragma once
5. #include"MyString.h"
6. class CStudent
7. {
8. public:
9. CStudent() { cout << "CStudent的默认构造函数被调用" << endl; }
10. CStudent(int num, const MyString & name,const MyString & major, double score);
11. ~CStudent() { cout << "CStudent的析构函数被调用" << endl; }
12. void set_number(int num) { number = num; }
13. int get_number(){ return number; }
14. MyString & set_name(const MyString & name);
15. MyString & get_name() { return name; }
16. MyString & set_major(const MyString & major);
17. MyString & get_major() { return major; }
18. void set_score(double score) { this->score = score; }
19. double get_score() { return score; }
20. private:
21. int number;
22. MyString name;
23. MyString major;
24. double score;
25. };26. //file: student.cpp
27. #include"student.h"28. CStudent::CStudent(int num, const MyString &name,const MyString &major, double score)
29. {
30. number = num;
31. this->name = name;
32. this->major = major;
33. this->score = score;
34. cout << "CStudent的有参构造函数被调用" << endl;
35. }36. MyString & CStudent::set_name(const MyString & name)
37. {
38. this->name = name;
39. return this->name;
40. }41. //file: main.cpp
42. #include"student.h"
43. #include<iostream>
44. using namespace std;
45. int main()
46. {
47. MyString name("zhangsan"), major("computer");
48. CStudent stu(1, name, major, 100), stu2;
49. CStudent stu3(stu);
50. stu2 = stu3;51. cout << stu.get_name().get_string() << endl;
52. cout << stu2.get_name().get_string() << endl;53. return 0;
54. }
其输出如下:
1. MyString的有参构造函数被调用
2. MyString的有参构造函数被调用
3. MyString的默认构造函数被调用
4. MyString的默认构造函数被调用
5. MyString的赋值运算符函数被调用
6. MyString的赋值运算符函数被调用
7. CStudent的有参构造函数被调用
8. MyString的默认构造函数被调用
9. MyString的默认构造函数被调用
10. CStudent的默认构造函数被调用
11. MyString的复制构造函数被调用
12. MyString的复制构造函数被调用
13. MyString的赋值运算符函数被调用
14. MyString的赋值运算符函数被调用
15. zhangsan
16. zhangsan
17. CStudent的析构函数被调用
18. MyString的析构函数被调用
19. MyString的析构函数被调用
20. CStudent的析构函数被调用
21. MyString的析构函数被调用
22. MyString的析构函数被调用
23. CStudent的析构函数被调用
24. MyString的析构函数被调用
25. MyString的析构函数被调用
26. MyString的析构函数被调用
27. MyString的析构函数被调用
对于例1,在定义CStudent类时使用了MyString类,比如其数据成员name是MyString类型的,也就是说MyString类的对象name作为CStudent的数据成员。这样,对于编写CStudent类的程序员来说,只需要知道MyString类的用法就行了,而不需要再去考虑如动态内存分配等细节,因而大大减轻了程序员的工作量。不过,类毕竟与普通的数据类型不同,因而就带来了一些问题。下面结合程序的输出,分析程序的运行过程如下:
(1)输出的第1、2行是程序第47行中构造name和major时产生的。
(2)程序第48行会调用CStudent类的有参构造函数构造对象stu、调用CStudent的默认构造函数构造stu2,而输出中的第7行才是CStudent的有参构造函数中输出的信息、第10行才是CStudent的默认构造函数输出的信息,因此输出的第3行至第10行都是因程序第48行产生的输出。这些输出表明,在CStudent的有参构造函数执行之前,先调用了两次MyString类的默认构造函数,然后调用了两次MyString类的赋值运算符函数;在执行CStudent的默认构造函数之前,先调用了两次MyString类的默认构造函数。然而,在CStudent类的有参构造函数中没有看到调用MyString类的默认构造函数初始化内嵌对象name和major的地方,那么两次调用MyString类的默认构造函数是怎么发生的?同理,在CStudent类的默认构造函数的实现中也没有显式调用MyString类的默认构造函数初始化内嵌对象name和major的地方,那么两次调用MyString类的默认构造函数是怎么发生的?这就需要介绍构造函数的初始化列表了。另外,在CStudent类的有参构造函数中的语句“this->name = name; this->major = major;”中直接使用了类的内嵌对象name和major(由此两次调用MyString类的赋值运算符函数,产生输出的第5和第6行),这说明这两个对象在进入该构造函数之前就已经构造完毕。既然在进入CStudent类的构造函数之前就能调用MyString类的构造函数初始化name和major,那么能不能通过传递CStudent类的有参构造函数中的参数name和major来调用MyString类的复制构造函数初始化CStudent类的成员对象name和major呢?这样做还可以省去在CStudent类的有参构造函数中对它们的赋值,即省去两次调用MyString类的赋值运算符函数的过程。
(3)程序第49行是调用CStudent类的复制构造函数,但例1中没有设计该函数,因此执行的是编译器自动提供的复制构造函数;程序第50行是一个赋值运算,由于例1中也没有为CStudent设计赋值运算符函数,因此编译器自动提供了默认的赋值运算符函数。显然程序第51行和第52行产生的输出为输出中的第15行和第16行,因此程序第49行和第50行产生的输出为输出中的第11行至第14行:显示调用了两次MyString类的复制构造函数和两次赋值运算符函数。根据输出的第15行和第16行的内容相同,且程序运行正常,可以判断编译器自动提供的复制构造函数和赋值运算符是正确的。那么,编译器自动提供的复制构造函数和赋值运算符函数是什么样的?
(4)例1中设计了CStudent类的析构函数,但在其函数体中只有一条输出语句。这是因为CStudent类中没有涉及动态内存分配,因此不涉及回收堆内存的问题。注意,MyString类型的对象name和major涉及了堆内存,不过回收其堆内存的工作由MyString类的析构函数完成。从程序中可以看出,对象的析构顺序为:依次析构对象stu3、stu2和stu,然后析构对象major和name。整个析构过程产生了输出中的第17行至第27行,其中析构stu3产生了输出中的第17行至第19行。那么,析构组合类对象stu3为什么是这样的一个过程?
下面会解释上面提出的问题。不过,在此之前,先介绍一下类的前向引用声明问题,因为这个问题在定义组合类时经常会用到。
在C++语言中,使用基本数据类型的变量时需要遵循先声明后引用的规则。与此类似,在定义新的类型时也要遵循这一规则。例如在例1中,在定义CStudent类之前,先通过预编译指令引入了MyString类的定义(例1的第5行)。在声明一个类之前就试图使用这个类则会出现编译错误,如例2所示。
【例2】 在声明一个类之前就试图使用这个类则会出现编译错误。
1. class A
2. {
3. public:
4. void A_fun(B b); //因之前没有声明类型B,故这里试图引用B会造成编译错误
5. int i;
6. };7. class B
8. {
9. public:
10. void B_fun(A a);
11. int j;
12. };
在例2中,在类A的定义中引用了类B。然而,B类还没有被声明,所以会造成编译错误。解决办法是进行前向类型声明,比如在声明A之前加入声明语句“class B;”。
进行了类的前向声明之后,仅能保证声明的符号可见,但在给出类的具体定义之前,并不能涉及类的具体内容,如下面的程序。
class B;
class A
{
public:int A_fun(B b){ return b.j; } //在给出B的具体定义之前涉及了其//具体内容,所以会出现编译错误int i;
};class B
{
public:int B_fun(A a);int j;
};
在上面的程序中,类A的函数A_fun()试图访问对象b的数据成员j,即试图引用B类的具体内容。然而,在此之前,类B的具体定义尚未给出,所以会出现编译错误。解决办法是将该函数的实现写在类外并且在类B的完整定义之后。
类似地,在给出类的完整定义之前,不能定义类的对象,因为定义类的对象就会涉及对象的构造,从而会涉及类的具体内容,如下面的程序。
class B;
class A
{
public:int A_fun(B b);B m_b; //在给出类B的完整定义之前定义B的对象会造成编译错误A m_a; //在类A的定义内部定义A的对象会造成编译错误
};class B
{
public:int B_fun(A a);int j;
};
在上面的程序中,类A试图定义B的对象m_b和A的对象m_a,然而此时类B和类A的定义都不完整,因而会造成编译错误。解决办法是:首先把类B的完整定义放到类A的定义之前;其次,在类A中不能定义类A的对象,只能定义类A的指针,如下面的程序。
class A; //因为定义类B时引用了类A,所以需要做前向声明
class B
{
public:
int B_fun(A a);int j;
};class A
{
public:int A_fun(B b){ return b.j; } //前面已有类B的完整定义,故该语句正确B m_b; //前面已有类B的完整声明,故此处能够定义类B的对象A* m_pa; //永远不能在类定义中定义自身的对象,可以定义自身的指针
};
01、组合类的构造函数
如前所述,在CStudent类的有参构造函数中可以直接使用内嵌的对象name,这就意味着该对象在程序执行CStudent类的有参构造函数之前就已经调用了MyString的构造函数完成了初始化。为了解释这个问题,就需要介绍初始化列表的概念了。
类的构造函数都带有一个初始化列表,主要作用是为初始化类的数据成员提供一个机会。如果在设计构造函数时没有在初始化列表中给出数据成员的初始化方式,则编译器会采用数据成员的默认的初始化方式——对于类的对象来说就是调用其默认的构造函数——进行初始化,且初始化列表中的内容会在执行构造函数之前执行。这就是在上面例1中的CStudent类的有参构造函数中可以使用其成员对象name的原因。
一般地,带初始化列表的构造函数的形式如下(仅以写在类的声明内部为例;写在类的声明外部与此相似,只是需要在函数名前加上类名和域作用符):
class 类名
{
public:类名(): 初始化数据成员1, 初始化数据成员2, ...{}...
};
以写在类的声明外部为例,CStudent类的有参构造函数可以写成如下形式。
CStudent::CStudent(int num, const MyString & name,const MyString & major, double score): number(num), name(name), major(major), score(score)
{cout << "CStudent的有参构造函数被调用" << endl;
}
其中初始化列表中的第一个name是CStudent的数据成员,第二个name是构造函数中的参数。在这个实现中,由于在初始化列表中使用复制构造函数初始化了name和major,所以在CStudent的构造函数内部就不需要再次为成员name和major赋值了。另外,基本数据类型number和score也可以在初始化列表中初始化,但要注意不能写成类似于“number = num”的形式。
另外,需要说明的是构造函数的调用顺序。由于初始化列表的存在,在调用组合类的构造函数之前会先调用其成员对象的构造函数,且当有多个成员对象时,C++语言规定按照成员对象在组合类声明中出现的顺序依次构造,而与它们在初始化列表中出现的顺序无关。例如,虽然name和major在上述构造函数的初始化列表中出现的顺序与在下面构造函数的初始化列表中出现的顺序不同,但在执行时都是先初始化name再初始化major,程序如下:
CStudent::CStudent(int num, const MyString & name,const MyString & major, double score): number(num), major(major), name(name), score(score)
{cout << "CStudent的有参构造函数被调用" << endl;
}
最后要强调的是,初始化列表可以省去——此时使用数据成员的默认方式初始化,但不意味着没有初始化列表。例如例1中,CStudent的默认构造函数实际的实现形式为在初始化列表中调用MyString的默认构造函数初始化name和major,但基本数据类型的成员number和score没有初始化,程序如下:
CStudent() : name(), major()
{cout << "CStudent的默认构造函数被调用" << endl;
}
例1中CStudent的有参构造函数实际的实现形式中的初始化列表与上面的类似:仅在初始化列表中使用MyString类的默认构造函数初始化数据成员name和major,没有初始化number和score,程序如下:
CStudent::CStudent(int num, const MyString &name,const MyString &major, double score) : name(), major()
{number = num;this->name = name;this->major = major;this->score = score;cout << "CStudent的有参构造函数被调用" << endl;
}
显然,这个实现中,为初始化name和major需要调用两次MyString类的默认构造函数和两次赋值运算符函数。因此,充分利用初始化列表还可以减少函数调用的次数,提高程序的运行效率。
02、组合类的析构函数
对于CStudent类来说,其析构函数没有多少特殊的地方:其要完成的功能主要是负责该类数据成员的清理。在CStudent类中,由于数据成员没有用到堆内存(对象name和major用到了,但它们由MyString类负责处理),所以不需要专门为它编写析构函数。
不过,对于组合类的析构函数也有需要说明的地方,那就是当组合类的对象超出生存期时析构函数的调用顺序问题。这里只需要遵循一个原则:析构函数的调用顺序与构造函数的调用顺序完全相反。如果把对象的初始化过程比喻为按照严格规程生产一台机器的过程,那么显然需要先按照设定的规程生产各个零部件(相当于调用作为数据成员的对象的构造函数),然后调试整台机器(相当于调用组合类的构造函数);当需要拆卸机器时,需要按照完全相反的顺序拆卸(相当于调用各部分的析构函数),否则就无法拆卸开来。对于CStudent类的对象,调用析构函数的顺序是:调用CStudent类的析构函数析构CStudent类的对象,然后调用MyString类的析构函数析构对象major,最后调用MyString类的析构函数析构对象name。
03、组合类的复制构造函数
正象普通的复制构造函数一样,如果没有编写它,编译器就会自动提供一个,并且其完成的功能就是实现对应数据成员的复制。比如,在例1中没有给出CStudent类的复制构造函数,因此编译器会自动提供一个如下形式的复制构造函数——注意在初始化列表中调用了MyString类的复制构造函数来初始化name和major。
class CStudent
{
public:CStudent(const CStudent & stu);...
};CStudent::CStudent(const CStudent & stu) : number(stu.number),name(stu.name), major(stu.major), score(stu.score)
{
}
如果明确给出了复制构造函数的定义,则编译器就不再提供默认的实现,因此关于复制构造函数的一切都需要程序员负责——一定要在初始化列表中使用复制构造函数初始化对象成员,比如下面这个实现就不太好。
CStudent::CStudent(const CStudent & stu)
{number = stu.number;name = stu.name;major = stu.major;score = stu.score;
}
这个实现没有明确给出初始化列表,但这并不意味着没有初始化列表,而是意味着在初始化列表中采用默认的形式对数据成员初始化,即name和major的初始化是通过调用MyString的默认构造函数——而不是复制构造函数——实现的,而基本数据类型的成员number和score没有初始化。也正因为如此,在上面的实现中需要分别为各数据成员赋值,否则将不能正确完成CStudent对象的复制。
04、组合类的赋值运算符
当没有为类提供赋值运算符函数时,编译器会自动提供一个赋值运算符函数,其完成的功能就是对数据成员逐一赋值:对于基本数据类型就是按位赋值,对于对象成员就是调用其赋值运算符函数进行赋值。在CStudent类中,虽然其对象成员name和major使用了堆内存,但因为已经为MyString类提供了实现深复制的赋值运算符函数,因此,编译器为CStudent类自动提供的赋值运算符函数能够正确运行,其实现形式如下:
CStudent & CStudent::operator=(const CStudent & stu)
{if (this != &stu) //防止自赋值{number = stu.number;name = stu.name; //调用MyString类的赋值运算符函数major = stu.major; //调用MyString类的赋值运算符函数score = stu.score;}return *this;
}
在例1中,第50行调用了CStudent类的赋值运算符函数。根据上述编译器为CStudent类自动提供的赋值运算符函数的形式,在函数实现中两次调用MyString类的赋值运算符函数。这正是第50行的程序产生了输出中的第13行和第14行的原因。
相关文章:

高效学 C++|组合类的构造函数
设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。【例1】 MyString类的对象作为CStudent类的数据成员。1. //MyString类的定义省略 2. //注意:保留其构造函数、析构函数、…...

Java使用Springboot+Mybatis构建第一个项目
一、java安装:安装 Java1.8环境 maven3.6.1环境 Gradle-6.9.1环境 IntelliJ IDEA 2022.1.3 下载旗舰版(因为包含springboot)二、项目构建-数据库是sqlserver:1、打开idea,点击File->New->Project,选中…...

L2-007 家庭房产 L1-007 念数字
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产: 编…...

1/4、1/2、整车悬架天棚主动控制仿真分析合集
目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 参考文献 前言 对于天棚控制相比大家不陌生,它是由美国的Karnopp提出,利用假设的与天棚固连…...

【微信小程序项目实战】TodoList-项目主体搭设(2)
目录JS 部分数据 dataonShow输入框双向绑定保存与读取添加新的待办事项完成待办事项删除待办事项WXML顶部输入框主体回到顶部按钮完整代码JSWXMLWXSSJS 部分 为便于分析各个组件的相互作用与原理,故先从 JS 入手,而后再完善 HTML 部分 以下所有代码&…...

23种设计模式-迭代器模式(安卓应用场景介绍)
迭代器模式是一种行为型设计模式,它允许你在不暴露集合对象内部结构的情况下遍历集合中所有元素。在本文中,我们将介绍迭代器模式的概念和原理,提供一个基于Java的示例,并探讨在Android应用程序开发中的实际应用。 迭代器模式的概…...

面试 - 软件工程体系
今天是我人生中的第二次面试,第一次面试到技术问题。 面试公司:无锡信捷电气股份有限公司 面试时间:2023 年 3 月 6 日 15:30 面试地点:西安工程大学(临潼校区)D-188 在技术面中,我表现的不是很…...

05-CSS
今日目标能够说出 为什么要用定位能够说出 定位的 4 种分类能够说出 4 种定位各自的特点能够说出 为什么常用子绝父相布局能够写出 淘宝轮播图布局能够说出 显示隐藏的 3 种方式以及区别1. 定位(position) 介绍1.1 为什么使用定位我们先来看一个效果,同时思考一下用…...

华为OD机试题,用 Java 解【分奖金】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...

Multisim 14.3 安装教程
1、首先解压Multisim 安装包。 2、解压完成后,双击点进去,找到setup这个文件,点进去。 3、找到setup文件里面的install.exe文件,并鼠标右键 “找到以管理员身份运行”。 4、选择“我接受上述许可协议”,点击下一步。 …...

06-Oracle表空间与用户管理(表空间,用户,备份与恢复,导入导出数据)
本讲主要内容: 1.表空间管理:表空间的作用,创建,修改,删除及管理; 2.用户管理:创建用户,修改用户,删除用户,修改密码,解锁; 3.用户…...

XSS攻击防御
XSS攻击防御XSS Filter过滤方法输入验证数据净化输出编码过滤方法Web安全编码规范XSS Filter XSS Filter的作用是通过正则的方式对用户(客户端)请求的参数做脚本的过滤,从而达到防范XSS攻击的效果。 XSS Filter作为防御跨站攻击的主要手段之…...

敏捷开发还需要PRD吗
一、PRD有什么用 prd提升与RD或者未来接手人的沟通效率 二、为什么会有PRD 首先来说说为什么会有PRD文档。 1、稍微大一点的团队产品经理未必能向每个人传达产品需求,这就需要有一个文档的形式来向项目的所有成员来传达需求,这就是文档的来源。 2、由…...

完整教程:使用Spring Boot实现大文件断点续传及文件校验
一、简介 随着互联网的快速发展,大文件的传输成为了互联网应用的重要组成部分。然而,由于网络不稳定等因素的影响,大文件的传输经常会出现中断的情况,这时需要重新传输,导致传输效率低下。 为了解决这个问题ÿ…...

数位dp-- 数字游戏
题目 思路 也是一道比较典型的数位dp的问题,关键的思想跟我上一篇博客很像, 首先把区间值变成[1,Y]-[1,X-1]的值,然后单独计算得到结果。 总的来说就是把这个数的每一位都单独拿出来,然后根据选0-an-1和选**an**两种方案单独计算&…...

Linux脚本 启动、重启、停止、授权
在jar包所在目录 vim start.sh | reload.sh | stop.sh输入以下命令 然后保存,进行授权 1.启动 nohup java -jar -Dfile.encodingutf-8 IntegrationFrame-sso-1.0.0-SNAPSHOT.jar & echo "started"2.重启 pid$(ps -ef|grep IntegrationFrame-sso-1.…...

Pytorch深度学习实战3-8:详解数据可视化组件TensorBoard安装与使用
目录1 什么是Tensorboard?2 Tensorboard安装3 Tensorboard可视化流程4 Tensorboard可视化实例4.1 常量可视化4.2 特征图可视化1 什么是Tensorboard? 在深度学习领域,网络内部如同黑箱,其中包含大量的连接参数,这给人工…...

华为OD机试 - 旋转骰子(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:旋转骰子…...

如何做SpringBoot单元测试?
前言单元测试(unit testing),是指对项目中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试,对于Java来说或者是在SpringBoot项目中,最小的可测试单元就是一个方法。做单元测试就是为了证明某段代码的执⾏结果是否符…...

ZZULI训练: 数组和字符串专题
ZZULI训练:数组和字符串专题ZZULI训练: 数组和字符串专题ZZULI训练:数组和字符串专题 部分多实例没写循环多次是因为在main里面循环了, 你们写的时候要加上只提供大概思路和核心代码建议多尝试一下c, 并没有想象的那么难 7-1 个位数统计 可以开个数组来存一下每个数组出现的…...

ElasticSearch如何解决深分页问题?
文章目录 前言From/Size参数Query阶段Fetch阶段深度分页问题Scroll遍历数据基本使用遍历优缺点缺点:优点:」Scroll Scan基本使用Scroll Scan与Scroll的区别Sliced ScrollSearch After基本使用基本原理优缺点总结ES7版本变...

JDK8新特性宝典
JDK8新特性 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…...

【C++】关于C++模板的分离编译问题
文章目录1.阐述模板的实例化和重复定义问题2.分离编译可能出现的问题3.解决方法将函数模板的定义放到头文件中模板定义的位置显式实例化模板总结1.阐述模板的实例化和重复定义问题 C模板是一种非常强大的工具,可以为我们提供通用的代码实现方式。然鹅,在…...

小应用记账本-第2章-数据库设计
小应用记账本-第2章-数据库设计 在上一章《小应用记账本-第1章-需求分析》已经罗列了我们需要的功能,因为很简单,所以这一章就来设计数据库吧。 Account表:账户表 字段名类型说明取值idint账户idaccount_namevarchar账户名称remaining_sumd…...

Spring Boot+Vue前后端分离项目练习06之网盘项目创建vue项目
1.安装环境 构建vue项目,需要提前安装相应的环境,这里主要就是node,npm和Vue CLl。 #1、安装nodejs brew install nodejs #2、再执行下面命令来安装npm(npm是开发nodejs时所用的依赖库) brew install npm #3、安装vue cli npm install -g v…...

Python - 单元测试
python-单元测试1 Unittest2 Pytest3 两者区别断言方面用例执行编写规则前后置操作setUp, setUpclass, setUpmodule 区别4 实战操作unittest:pytest:1 Unittest unittest属于python的内置框架,支持多种自动化测试用例的编写,以及支持用例前置条件和后置…...

特权级那些事儿-实模式下分段机制首次出现的原因
前言: 操作系统的特权级模块在整个操作系统的学习中应该算的上是最难啃的了,提到特权级就要绕不开保护模式下的分段机制;如果想要彻底弄明白就要对比实模式下的分段机制有什么缺陷。这就衍生出很多问题如:什么是实模式?…...

详解Vue安装与配置(2023)
文章目录一、官网下载node.js二、安装Node.js三、环境配置四、idea导入vue项目五、IDEA添加Vue.js插件一、官网下载node.js Vue是前端开发框架。搭建框架,首先要搭建环境。搭建Vue的环境工具:node.js(JavaScript的运行环境)&…...

TypeScript深度剖析:Vue项目中应用TypeScript?
一、前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官方推出的一个支持使用class方式来开发vue单文件组件的库 主要的功能如下: metho…...

linux面试高级篇
题目目录1.虚拟机常用有几种网络模式?请简述其工作原理或你个人的理解?2. Dockerfile中最常见的指令是什么?3.docker网络模式有哪些?4.Kubernetes有哪些核心组件这些组件负责什么工作?5. Pod是什么?6.描述一…...