C++:运算符重载

运算符重载的基本概念

与函数重载相似,运算符也存在重载问题。C++为了解决一些实际问题,允许重载现有的大多数运算符,即允许给已有的运算符赋予新的含义,从而提高C++的可扩展性,针对同样的操作,使用重载运算符比函数的显示调用更能提高程序的可读性。
C++对运算符重载进行了一下规定限制:

  1. 只能重载C++中原先已定义的运算符。不能自己“创造”新的运算符进行重载。
  2. 并不是所有的运算符都可以进行重载。不能进行重载的运算符有“·”“.*”“::”“?:”。
  3. 不能改变运算符原有的优先级和结合性。C++已预先规定了每个运算符的优先级和结合性,已决定运算次序。不能改变其运算次序,若确实需要改变,只能采用加“()”的方法。
  4. 不能改变运算符对预定义类型数据的操作方式,但是可以根据实际需要,对原有运算符进行是当地改造与扩充。
  5. 运算符重载有两种方式,即重载为类的成员函数和重载为类的友元函数。

成员函数重载运算符

C++允许重载大多数已经定义的运算符。运算符重载函数既可以是类的成员函数,也可以是类的友元函数。
在类的内部定义成员函数重载运算符的格式为:class 类名{返回类型 operator 运算符(形参表)};
在类的外部定义成员函数重载运算符的格式为:返回类型 类名::operator 运算符(形参表){//函数体}
说明:返回类型是指运算符重载函数的运算结果类型;operator是定义运算符重载的关键字;运算符是要重载的运算符名称;形参表中给出了重载运算符所需要的参数和类型。

重载单目运算符

用成员函数重载运算符时,若运算符时单目的,则参数表为空,因为这是操作数访问该重载运算符对象本身的数据,该对象有this指针指向,所以参数表为空。
单目运算符的调用有两种,即显式调用和隐式调用。
显示调用:对象名.operator 运算符()
隐式调用:重载的运算符 对象名
例如:重载“-”(负号)运算符。

#include <iostream>
using namespace std;
class Point
{
public:Point(int i = 0, int j = 0) :x(i), y(j) {};Point operator -() {x = -x;y = -y;return *this;}void Print();
private:int x, y;
};int main() {Point ob(1, 2);cout << "ob:";ob.Print();cout << endl;cout << "-ob:";ob = ob.operator-(); //显式调用//ob = -ob;       //隐式调用ob.Print();cout << endl;return 0;
}
void Point::Print()
{cout << x << " " << y << endl;
}

重载双目运算符

重载双目运算符时,左边操作数是访问改重载运算符对象本身的数据,有this指针指向,右边操作数通过重载运算符的成员函数的参数指出,所以,成员函数只有一个函数。
双目运算符的调用有两种方式,即显式调用和隐式调用。
显式调用:对象名.operator 运算符(参数)
隐式调用:对象名 重载的运算符 参数
例如:重载“+”运算符,以实现连个字符串相加。

#include <iostream>
#include <string.h>
using namespace std;
const int MAX = 20;
class String
{
public:String(const char *instr = NULL);String operator+(const char *astr);void ShowString();private:char buffer[MAX];int length;
};int main() 
{String title("C/C++");//定义对象时,调用构造函数给成员buffer赋值title = title + " Program";//隐式调用title = title.operator+("!");//显式调用title.ShowString();return 0;
}String::String(const char* instr)
{if (instr != NULL){strcpy_s(buffer, strlen(instr) + 1, instr);length = strlen(buffer);}
}String String::operator+(const char* astr)
{String temp;int templen;templen = strlen(buffer) + strlen(astr);if (templen + 1 > MAX){cout << "String is too large!" << endl;strcpy_s(temp.buffer, strlen(buffer) + 1, buffer);//相当于strcpy_s(temp.buffer, strlen(this->buffer) + 1, this->buffer);return temp;}length = templen;strcpy_s(temp.buffer, strlen(buffer) + 1, buffer);strcat_s(temp.buffer, templen + 1, astr);return temp;
}void String::ShowString()
{cout << buffer << endl;
}

例如:用成员函数重载运算符实现复数的加、减运算。

#include <iostream>
using namespace std;class Complex
{
public:Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {};void Print();Complex operator+(Complex c);Complex operator-(Complex c);
private:double real;double imag;
};int main() 
{Complex com1(1.1, 2.2), com2(3.3, 4.4), total;total = com1 + com2;total.Print();total = com1 - com2;total.Print();return 0;
}void Complex::Print()
{cout << real;if (imag > 0) cout << "+";if (imag != 0) cout << imag << "i" << endl;
}Complex Complex::operator+(Complex c)
{Complex temp;temp.real = real + c.real;temp.imag = imag + c.imag;return temp;
}Complex Complex::operator-(Complex c)
{Complex temp;temp.real = real - c.real;temp.imag = imag - c.imag;return temp;
}

重载++、- -运算符

在C++中经常使用前缀和后缀的++、- -运算符,若将++(或- -)运算符置于变量前,则C++在引用变量前先加1(或先减1);若将++(或- -)运算符置于变量后,则C++在引用变量后使变量加1(或使变量减1)。使用格式:
类名 operator ++() //前缀方式
类名 operator ++(int)//后缀方式
类名 operator --()//前缀方式
类名 operator --(int)//后缀方式
例如:为类Point重载++运算符

#include <iostream>
using namespace std;
class Point
{
public:Point(int i = 0, int j = 0) :x(i), y(j) {};Point operator++();Point operator++(int);void Print();
private:int x, y;
};int main()
{Point ob1(1, 2), ob;ob1.Print();ob = ++ob1;ob.Print();ob = ob1++;ob.Print();ob1.Print();return 0;
}Point Point::operator++()
{++x;++y;return *this;
}Point Point::operator++(int)
{Point temp = *this;//确保原对象值x++;y++;return temp;
}void Point::Print()
{cout << "(" << x << "," << y << ")" << endl;
}

重载赋值运算符

在C++中,对于任何一个类,若没有用户自定义的赋值运算符函数,系统就会自动为其生成一个默认的赋值运算符函数,以完成数据成员之间的逐位复制。通常,默认的赋值运算符函数可以完成赋值任务,但在某些特殊情况下,若类中有指针类形式,就不能进行直接的相互赋值。
例如:指针悬挂问题。

#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;
class Student
{
public:Student(const char *na, int sco);Student& operator=(const Student&);~Student();void Print();
private:char* name;int score;
};Student::Student(const char* na, int sco)
{name = new char[strlen(na) + 1];strcpy_s(name, strlen(na) + 1, na);score = sco;
}Student& Student::operator=(const Student& p)//定义赋值运算符重载函数
{if (this == &p) return *this;//避免p=p的赋值delete[]name;//释放空间name = new char[strlen(p.name) + 1];//分配新空间strcpy_s(name, strlen(p.name) + 1, p.name);//字符串拷贝score = p.score;return *this;
}Student::~Student()
{delete[]name;
}
void Student::Print()
{cout << name << setw(6) << score << endl;
}
int main()
{Student s1("李明", 60);Student s2("李华", 80);s2.Print();s2 = s1;s2.Print();return 0;
}

注意:1.赋值运算符不能重载为友元函数,只能重载为一个非静态成员函数;2.赋值运算符重载函数不能被继承。

重载下标运算符

当程序变得复杂时,有时需要必须重载数组下标运算符[]。C++重载数组运算符时,认为其是双目运算符,因此重载数组下标运算符时,运算符成员函数的格式为:返回类型 类名::operator[](形参){//函数体}
例如:重载下标运算符应用,用一维数组实现一个三维向量类。

#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;
class Vector
{
public:Vector(int a1,int a2,int a3);int& operator[](int b);
private:int v[3];
};Vector::Vector(int a1, int a2, int a3)
{v[0] = a1;v[1] = a2;v[2] = a3;
}int& Vector::operator[](int b)
{if (b < 0 || b >= 3){cout << "Bad subscript!" << endl;exit(1);}return v[b];
}int main()
{Vector v(1, 3, 5);cout << "修改前:";for (int i = 0; i < 3; i++){cout << v[i] << setw(4);}cout << endl;cout << "修改后:";for (int i = 0; i < 3; i++){v[i] = 2 * i;}for (int i = 0; i < 3; i++){cout << v[i] << setw(4);}cout << endl;return 0;
}

注意:1.重载下标运算符的优点是,可以增加C++中数组检索的安全性;2.重载下标运算符时,返回一个int的引用。可使重载的[]运算符用在赋值语句的左边,因而在main()中,v[i]可以出现在赋值运算符的任何一边,使编制程序更灵活了。

重载函数调用运算符

重载函数调用运算符()时,并不是创建新的调用函数的方法,而是创建了可传递任意数目参数的运算符函数。通常重载函数调用运算符时,定义了传递给重载函数的参数。重载函数调用运算符成员函数的格式为:返回类型 类名::operator()(形参){//函数体}
例如:重载函数调用运算符

#include <iostream>
using namespace std;
class Matrix
{
public:Matrix(int, int);int& operator()(int, int);
private:int* m;int row, col;
};Matrix::Matrix(int r, int c)
{row = r;col = c;m = new int[row * col];for (int i = 0; i < row * col; i++)*(m + i) = i;
}int& Matrix::operator()(int r, int c)
{return (*(m + r * col + c));
}int main()
{Matrix m(10, 10);cout << m(3, 4) << endl;m(3, 4) = 35;cout << m(3, 4) << endl;return 0;
}

说明:程序中,m(10,10)相当于一个1010列的二维矩阵。在执行语句cout << (3,4) << endl;时,编译器将m(3,4)解释为m.operator()(3,4),从而调用运算符重载函数operator()(int r,int c),然后返回矩阵第3行第4列的元素值;语句m(3,4)=35修改矩阵第3行第4列的元素值,之所以能够这样写,是因为operator()是一个返回引用类型int&

友元函数重载运算符

在大多数情况下,用友元函数或成员函数重载运算符在功能上没有差别。用友元函数重载运算符时,因为友元函数没有this指针,所以若运算符是单目的,则参数表中有一个操作数;若运算符是双目的,则参数表中有两个操作数。友元函数重载运算符的格式为:
friend<函数类型>operator<重载的运算符>(<形参>){}//单目运算符重载
friend<函数类型>operator<重载的运算符>(<形参1, 形参2>){}//双目运算符重载
例如:用友元函数重载运算符实现复数的加、减运算。

#include <iostream>
using namespace std;class Complex
{
public:Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {};void Print();friend Complex operator+(Complex a, Complex b);friend Complex operator-(Complex a, Complex b);
private:double real;double imag;
};int main()
{Complex com1(1.1, 2.2), com2(3.3, 4.4), total;total = com1 + com2;total.Print();total = com1 - com2;total.Print();return 0;
}void Complex::Print()
{cout << real;if (imag > 0) cout << "+";if (imag != 0) cout << imag << "i" << endl;
}Complex operator+(Complex a, Complex b)
{Complex temp;temp.real = a.real + b.real;temp.imag = a.imag + b.imag;return temp;
}Complex operator-(Complex a, Complex b)
{Complex temp;temp.real = a.real - b.real;temp.imag = a.imag - b.imag;return temp;
}

成员函数与友元函数重载运算符的比较

在进行运算符重载时,既可以用成员函数重载,也可以用友元函数重载。下面是它们的比较。

  1. 对于双目运算符,用成员函数重载时参数表中有一个参数,而用友元函数重载时参数表中有两个参数;对于单目运算符,用成员函数重载时参数表没有参数,而用友元函数重载时参数表中有一个参数。
  2. 双目运算符一般可以用友元函数重载或用成员函数重载,下面的情况必须使用友元函数重载。
    例如,用成员函数重载“+"运算符:
    Complex Complex::operator+(int c)
    {Complex temp;temp.real = real + c;temp.imag = imag + c;return temp;
    }
    
    若类Complex的对象com要做赋值运算和加法运算,则下面的语句是正确的:com=com+10;这是因为对象com是“+”运算符的左操作数,在调用重载“+”运算符的函数时,this指针指向com。因此语句temp.real=real+a相当于remp.real=this->real+a;,而下面的语句就不正确了:com=10+com;这是因为左操作数是一个整数,而整数是一个内部数据类型,不能产生对成员运算符函数的调用。
    解决这类问题的方法,采用两个友元函数来重载“+”运算符,从而消除由于“+”运算符的左操作数为内部数据类型带来的问题。
    C++中的不部分运算符既可以用成员函数重载,也可以用友元函数重载。在选择时主要取决于实际情况和使用者的习惯。运算符重载规则如下:
    1.对于双目运算符,用友元函数重载比用成员函数重载更便于使用。若一个运算符的操作需要修改类对象的状态,建议使用成员函数重载;若运算符所需的操作数(尤其是第一个操作数)虚妄有隐式类型转换,则运算符必须用友元函数重载。
    2.对于赋值“=” 、函数调用“()”、下标“[]”、指针成员引用“->”等运算符,必须用成员函数重载,否则将导致编译错误。
    3.对于流插入“<<”和流提取“>>”运算符,必须用友元函数重载。
    4.对于单目运算符(如取负“-”、指针“*”、取地址“&”),自增“++”、自减“--”等运算符,建议选择成员函数重载。
    5.对于复合赋值运算符+=、-=、/=、*=、&=、!=、~=、%=、>>=、<<=,建议用成员函数重载。
    6.对于算术运算符、关系运算符、逻辑运算符、位运算符等,建议用友元函数重载。

类型转换

系统预定义类型之间的转换

C++规定,当不同类型的数据进行运算时,需先将数据转换成同一类型,然后才可以进行运算。数据的类型转换可以通过两种转换形式完成:一种是隐式类型转换;另一种是显式类型转换。

  1. 隐式类型转换
    当执行赋值表达式V=E时,若VE的类型不一致,则将E先转换为V的类型后再赋值。
    与C语言一样,C++中规定数据类型级别从高到低的次序是:double ->float->long->int->short/char
    当两个操作数类型不一致时,运算之前将级别低的自动转换为级别高的,然后再进行运算。
  2. 显式类型转换
    显示类型转换有以下两种方式。1. 强制转换法:(类型名)表达式;2.函数法:类型名(表达式)。
    以上的种种是一般数据类型之间的转换,那该如何实现用户自定义类型与其他数据类型的转换呢?通常采用两种方法:用构造函数实现类型转换和用运算符转换函数实现类型转换。

用构造函数实现类型转换

用构造函数实现类型转换,类内至少定义一个只带一个参数(没有其他参数,或其他参数都是默认值)的构造函数。这样,当进行类型转换时,系统会自动调用该构造函数,创建该类的一个临时对象,该对象由被转换的值初始化,从而让实现类型转换。
例如,将一个char型数据转换为String类型的数据

#include <iostream>
#include <string.h>
using namespace std;
class String
{
public:String(const char* ch = NULL);~String();void Print();
private:char* str;int length;
};String::String(const char* ch)
{if (ch != NULL){length = strlen(ch);str = new char[strlen(ch) + 1];strcpy_s(str, strlen(ch) + 1, ch);}
}String::~String()
{delete[]str;
}void String::Print()
{cout << str << endl;
}int main()
{String s = "C/C++ program!";s.Print();return 0;
}

说明:语句“String(const char* ch = NULL);”声明了一个转换构造函数。该构造函数可以用来进行类型转换。主函数中,再执行语句“String s = "C/C++ program!";”时,编译器首先调用构造函数建立包含“C/C++ program!”的一个临时String类的对象(通过转换构造函数将一个char*字符串转换为String的对象),然后再将该临时String类的对象赋给对象s。使用这种转换构造函数意味着不用再为字符串赋给String类对象提供重载的赋值运算符。任何只带一个参数(或其他参数都带有默认值)的构造函数都可以认为是一种转换构造函数。

用运算符转换函数实现类型转换

用构造函数可以实现类型转换,但是其所完成的类型转换功能具有一定的局限性。由于无法为系统预定义类型定义构造函数,因此,不能利用构造函数把自定义类型的数据转换为系统预定义类型的数据,只能实现系统预定义类型向自定义类型的类型转换。
为了解决上述问题,C++允许用户在类中定义成员函数,从而得到要转换的类型。
运算符转换函数定义格式为:

class 类名
{operator目的类型(){return 目的类型的数据;}
};

其中,目的类型为要转换成的类型,它既可以是用户自定义的类型,也可以是系统的预定义类型。
在使用运算符转换函数时,需要注意以下三个问题:

  1. 运算符转换函数只能定义为一个类的成员函数,而不能定义为类的额友元函数;
  2. 运算符转换函数既没有参数也不显式地给出返回类型;
  3. 运算符转换函数中必须有“return 目的类型的数据;”这样的语句,即必须返回目的类型数据作为函数的返回值。
    例如:自定义类型向预定义类型的转换。
#include <iostream>
using namespace std;
class Complex
{
public:Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {};operator float();operator int();void Print();
private:double real;double imag;
};int main()
{Complex com1(2.2, 4.4);cout << "com1=";com1.Print();cout << "Type changed to float..." << endl;cout << "float(com1)*0.5=";cout << float(com1) * 0.5 << endl;Complex com2(4.7, 6);cout << "com2=";com2.Print();cout << "Type changed to int..." << endl;cout << "int(com2)*2=";cout << int(com2) * 2 << endl;return 0;
}Complex::operator float()
{return real;
}Complex::operator int()
{return int(real);
}void Complex::Print()
{cout << real;if (imag > 0) cout << "+";if (imag != 0) cout << imag << "i" << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL】函数与操作符-位串函数和操作符

PostgreSQL函数与操作符-位串函数和操作符 PostgreSQL函数与操作符-位串函数和操作符描述用于检查和操作位串的函数和操作符&#xff0c;也就是操作类型为bit和bit varying的值的函数和操作符。除了常用的比较操作符之外&#xff0c;还可以使用下表里显示的操作符。&、|和…

ssh -T git@github.com Connection timed out 解决方案-自测有效

ssh -T gitgithub.com Connection timed out 解决方案-自测有效 $ ssh -T gitgithub.com $ ssh -vT gitgithub.com -p 443 OpenSSH_9.5p1, OpenSSL 3.1.4 24 Oct 2023 debug1: Reading configuration data /c/Users/Administrator/.ssh/config debug1: /c/Users/Administrator…

群晖NAS上安装部署开源工作流自动化工具n8n

一、开源工作流自动化工具n8n简介 n8n是它是一个与其他应用集成的应用程序&#xff0c;目标是自动化各应用之间的流程;利用 n8n 你可以方便地实现当 A 条件发生&#xff0c;触发 B 服务这样的自动工作流程。 n8n优点是&#xff1a;代码开源、可以自托管、下载安装方便、易于使用…

Java毕业设计第90期-基于springboot的学习英语管理系统

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于springboot的学习英语管理系统&#xff1a;前端 thymeleaf、jquery&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;角色分为管理员、用户&#xff…

Java初学者软件安装与idea快捷键

一.Java初学者软件安装 视频教程&#xff1a; 最通俗易懂的JDK、IDEA的安装使用权威指南_哔哩哔哩_bilibili 文档教程&#xff1a; Java 开发环境配置 | 菜鸟教程 (runoob.com) 二.java的快捷方式与插件 快捷键&#xff1a; 史上最全的IDEA快捷键总结_idea的快捷语法_扬帆…

VSCode使用技巧

选择python 解释器 使用快捷键CtrlShiftP Python: Select Interpreter快捷键 返回上一次光标的位置 重新设置一下 navigate

【LLM】Prompt微调

Prompt 在机器学习中&#xff0c;Prompt通常指的是一种生成模型的输入方式。生成模型可以接收一个Prompt作为输入&#xff0c;并生成与该输入相对应的输出。Prompt可以是一段文本、一个问题或者一个片段&#xff0c;用于指导生成模型生成相应的响应、续写文本等。 Prompt优化…

springboot(ssm二手手机交易平台 二手机商城系统Java系统

springboot(ssm二手手机交易平台 二手机商城系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; …

ROS第 2 课 ROS 系统安装和环境搭建

文章目录 方法一&#xff1a;一键安装&#xff08;推荐&#xff09;方法二&#xff1a;逐步安装&#xff08;常规安装方式&#xff09;1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …

JS -- 正则表达式教程

1 概念 ECMAScript 通过 RegExp 类型支持正则表达式。 2 写法 2.1 类似 Perl 的简写语法&#xff1a; let pattern /a/g let pattern2 /a/i2.2 构造函数创建&#xff1a; let pattern new RegExp(a, g) let pattern new RegExp(a, i)上面两种是等价的正则表达式 3 修…

Vue面试之Mixins

Vue面试之Mixins 定义Mixins使用Mixins全局MixinsMixins合并策略注意事项命名冲突&#xff1a;过度使用 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ …

SpringBoot Redis入门(四)——Redis单机、哨兵、集群模式

单机模式&#xff1a;单台缓存服务器&#xff0c;开发、测试环境下使用&#xff1b;哨兵模式&#xff1a;主-从模式&#xff0c;提高缓存服务器的高可用和安全性。所有缓存的数据在每个节点上都一致。每个节点添加监听器&#xff0c;不断监听节点可用状态&#xff0c;一旦主节点…

ES6的一些冷门实用操作

ES6&#xff08;ECMAScript 2015&#xff09;引入了许多新的功能和语法&#xff0c;其中一些功能可能相对较冷门&#xff0c;但非常实用。本文将介绍一些这样的高级技巧&#xff0c;包括 Object.entries() Object.fromEntries() Array.of Array.from .at和flat WeakMap和W…

主流人工智能AI工具测评

主流人工智能AI工具测评 主流的人工智能AI工具ChatGPT ——OpenAI研发CHAT_BISON——Google研发Qwen通义千问 ——阿里云研发文心一言——百度研发 根据10个问题分析人工智能的回答女朋友生气了怎么哄千元机性价比推荐小米13 和 vivo iQOO 11s哪个好计算机专业毕业论文护士年终…

kafka-ui通过docker部署

创建docker-compose.yaml services:kafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestports:- "8080:8080"environment:DYNAMIC_CONFIG_ENABLED: "true"volumes:- ~/kui:/etc/kafkauiextra_hosts:- "kafka1:10.10.33.30"…

web前端第二次作业

1&#xff0c;计算用户指定的数值内的奇数和 效果运行图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计算用户指定的数值内的奇数和</title> </head>…

使用 Haproxy 搭建Web群集

本章主要学习&#xff1a; 熟悉 Haproxy 功能以常用群集配置调度算法学会Haproxy 常用配置学会 Haproxy 参数优化 简介 在前面已经学习了使用Nginx&#xff0c;LVS 做负载均衡群集&#xff0c;他们都具有各自的特点&#xff0c;本章将要介绍另一款比较流行的群集调度工具 Hap…

CMU15-445-Spring-2023-Project #3 - 前置知识(lec10-14)

Lecture #10_ Sorting & Aggregation Algorithms Query Plan 数据库系统会将 SQL 编译成查询计划。查询计划是一棵运算符树。 Sorting DBMS 需要对数据进行排序&#xff0c;因为根据关系模型&#xff0c;表中的tuple没有特定的顺序。排序使用 ORDER BY、GROUP BY、JOIN…

虚拟机 以及 Centos 7的 安装全过程

目录 安装VMwere Workstion 虚拟机的操作过程 CentOS 7 安装过程 install CentOS 7 安装操作系统 安装VMwere Workstion 虚拟机的操作过程 更改安装位置 到下面图片中的这一个步骤&#xff0c;可以点击许可证&#xff0c;输入密钥就可以使用了&#xff0c; 密钥可以去某度或…

阿里云有哪些优势?为什么选择阿里云?

为什么选择阿里云&#xff1f;阿里云服务器有哪些优势&#xff1f;阿里云全球第三&#xff0c;国内第一云&#xff0c;阿里云服务器网aliyunfuwuqi.com分享云服务器ECS在丰富ECS实例架构、弹性灵活、稳定可靠、便捷易用、安全保障和成本优化多方面优势&#xff1a; 阿里云服务…