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

面向对象程序(C++)设计基础

一、类&对象

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面是一些针对类这一概念的知识记忆点📃。

  • 类的概念,首先是,数据的算法(操作)结合,构成一个不可分割的整体(对象)。其次,在这个整体中一些成员是保护的,他们被有效的屏蔽,以防外界的干扰和误操作。另一些成员是公共的,他们作为接口,提供给外界使用。

  • 一个类的所有对象调用的成员函数都来自于同一代码段,在调用成员函数的时候,其实传递了相应对象的指针。类的作用域是指类定义和相应成员函数定义的范围。类型名与非类型名在同一作用域之间可以重名。

  • 一个类的默认访问控制符为private。private和Product在访问控制的时候是一样的。

class Line// 类名
{public: //访问修饰符void setLength( double len );double getLength( void );//变量Line(double len);  // 这是构造函数private:double length;//方法
};// 成员函数定义,包括构造函数
Line::Line( double len)
{cout << "Object is being created, length = " << len << endl;length = len;
}void Line::setLength( double len )
{length = len;
}double Line::getLength( void )
{return length;
}
// 程序的主函数
int main( )
{Line line;/声明Line类的对象line// 设置长度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;return 0;
}

二、构造&析构函数

类的构造函数与析构函数是类的一种特殊的成员函数,每次创建类的新对象时执行构造函数,每个删除所建立的对象时执行析构函数。下面是一些笔者在学习此知识点时的一些笔记。📋

  • 析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只是在类对象生命周期结束的时候,由系统自动调用。析构函数以调用函数相反的顺序被调用。构造函数能够给参数配置默认值,如果为类定义了一个带参数的构造函数,还想要无参的构造函数,则必须自己定义。

  • 为解决成员变量初始值的问题(包括成员变量为对象),可在构造函数后添加:运算符,并可以用分开。()表示初始化的参量。在包含对象成员的类对象创建的时候,需要对象成员的创建,相应的调用对象成员的构造函数。然而,构造对象成员的顺序要看类中的声明顺序,而不是看构造函数说明中冒号后面成员初始化的顺序。

C::C( double a, double b, double c): X(a), Y(b), Z(c)
{....
}

我们从更深层次的数据存储以及对象间相互赋值的底层原理,了解一下堆与拷贝构造函数的相关概念如下:👀

  • 全局变量,静态数据,常量存放在全局数据区,所有类成员函数和非成员函数存放在代码区,为运行函数而分配的局部变量,函数参数,返回数据,返回地址等存放在栈区,余下的空间都被作为堆区。

  • new是为一个固定的数据类型在堆内申请一段空间,包含数据的构造这个过程。从堆上分配对象数组,只能调用默认的构造函数,不能调用其他任何构造函数。在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝。拷贝构造函数的形参为类型的引用。如果你的类需要一个析构函数来析构资源,则它也需要一个拷贝构造函数(深拷贝与浅拷贝的区别是在拷贝构造函数是否申请了资源)。

  • 在返回值为对象的时候,会产生临时对象,临时对象在整个创建他们的外部表达式范围内有效。

三、静态成员与友元

我们可以使用 static 关键字来把类成员定义为静态成员。类定义中函数原型前使用关键字 friend来声明为一个类的友元函数。下面是一些针对静态成员以及友元的概念详解。🔖

  • 静态成员只与类相联系。静态数据成员在类声明外分配空间和初始化。一个静态成员函数不与任何对象联系,故不能对非静态成员进行默认访问。(静态成员函数和非静态成员函数的本质区别是静态成员函数没有this指针)。

  • 友元是独立的函数,不是类的成员函数。友元的添加是为了提高效率,防止成员函数的反复调用。友元函数同时在两个类中生命,即可以访问两个类中的内容。一个类的成员函数,可以是另一个类的友元。整个类可以使另一个类的友元。友类的每个成员函数都可访问另一个类中的保护或私有数据成员。

四、继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。继承代表了一种包含关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。

4.1继承基本概念

  • 多态性:函数接收的形参是基类,而实参如果是父类,则还是调用父类的重载函数(函数声明一模一样)。这样就导致函数内调用的函数会发生多态,用迟后联编或者叫滞后联编来确定到底用哪个函数。含有父类的子类,布局上This指针先指向父类数据部分,后指向子类数据部分。

  • 若语言不能支持多态,则不能称之为面向对象的。多态性增加了一些数据存储和执行指令的代价。有一种例外,如果基类中的虚函数返回一个基类指针或返回一个基类的引用,子类中的虚函数返回一个子类的指针或者子类的引用,则C++将其视为同名虚函数而进行迟后联编。

  • 一个类中的将所有的成员函数都尽可能地设置为虚函数对编程固然方便,JAVA语言中正是这样做的,但是会增加一些时空上的开销。对于C++来说,在对性能上有偏激追求的编程中,只选择设置个别成员函数为虚函数。

  • 只有类的成员函数才能说明为虚函数,静态成员函数不能是虚函数(this指针加虚函数列表实现多态),内联函数不能为虚函数。构造函数不能是虚函数,析构函数可以是虚函数,并且通常声明为虚函数。

  • 多态性虽然可以解决类的冗余,但是为了解决类的冗余而可以制造包含关系,将使问题往不可控制的方向发展。类的分解才是更好解决冗余的方法,将两个冗余的类根据冗余部分再抽象一个类,再让这两个冗余的类继承这个抽象出来的类。

  • 具有纯虚函数的类为抽象类,其并不能构造一个具体的类。纯虚函数是在积累中为子类保留一个位置,以便子类用自己的实在函数定义来覆盖之,如果在基类中没有保留位置,则就没有覆盖。

  • 保护的访问权限对于派生类来说是共有的,而对于其他对象来说是私有的,派生类也不能访问基类中私有的数据成员和成员函数。

4.2多重继承:

多重继承指的是一个类可以同时继承多个 类 ,比如A类继承自B类和C类,这就是多重继承。下面是对继承更多相关概念的一些详解。

  • 在多重继承的时候,出现名称的冲突,需要说明基类:对象名.基类名.成员函数(或者成员变量)

  • 虚拟继承的虚拟和虚拟函数的虚拟没有任何关系,虚拟继承的作用就是如果还没有基类,则加入一个基类的拷贝,否则就用有的那个基类。任何虚拟函数基类的构造函数按照他们被继承的顺序构造。任何非虚拟基类的构造函数按照他们被继承的顺序构造。任何成员对象的构造函数按照他们声明的顺序调用。类自己的构造函数。

  • 在继承的关系中,基类的private成员不但对应用程序隐藏,甚至对派生类也隐藏。而基类的保护成员则只对应用程序隐藏,而对派生类毫不隐瞒。一个私有的或保护的派生类不是子类,程序不能接受其变为子类引用去传递给函数形参。.在无继承的类中,protected和private控制符是没有区别的。在继承中,基类的private对所有的外界都屏蔽(包括自己的派生类),基类的protected控制符对应用程序是屏蔽的,但对其派生类是可访问的。

下面是针对继承概念的一个简单C++实现:

#include <iostream>using namespace std;// 基类
class Shape 
{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}protected:int width;int height;
};// 派生类
class Rectangle: public Shape
{public:int getArea(){ return (width * height); }
};int main(void)
{Rectangle Rect;Rect.setWidth(5);Rect.setHeight(7);// 输出对象的面积cout << "Total area: " << Rect.getArea() << endl;return 0;
}

五、运算符重载:

您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。下面的代码将针对Box加法运算符进行了重载,用于把两个 Box 对象相加,返回最终的 Box 对象。

// 重载 + 运算符,用于把两个 Box 对象相加Box operator+(const Box& b){Box box;box.length = this->length + b.length;box.breadth = this->breadth + b.breadth;box.height = this->height + b.height;return box;}

下面是一些与运算符重载的相关概念详解:📑

  • 运算符是函数,除了运算顺序和优先级不能修改之外,参数和返回值类型是可以重新说明的,即可以重载,重载的形式是,返回类型 operator 运算符号(参数说明)。运算符重载作为成员函数在声明和第一时,形式上少了一个参数,这是由于C++对所有的成员函数隐藏了第一个参数this。return *this 当返回值为引用的时候。

  • 后增量返回的是原有对象值的临时对象。C++约定,在增量运算符定义中,放上一个整数形参,就是后增量运算符。前增量运算符返回引用,后增量运算符返回值。

  • 转换运算符将对象转换成类型名规定的类型。operator double(){};寻找的次序:1.寻找成员函数的+运算符;2寻找非成员函数的+运算符。3.由于存在内部运算符operator +(double,double);所以假定匹配其程序中的算法。4.寻找能将实参(RMB对象)转化为double型的转换运算符operator double()。

  • 转换运算符与转换构造函数互逆。例如类名(double)转换构造函数将double转换为RMB,而RMB::operator double()将RMB转换成double。转换运算符没有返回值。拷贝构造函数和赋值运算符,区别在类的对象是否已经存在。赋值运算符符实现之前,释放已有对象所占用的资源。

六、I/O流

C++的IO流,特指以流的方式进行输入输出的ISO/ANSI标准C++库的输入输出类库,也就是专门负责处理IO操作的一套系统。 任何需要传递的数据,都要经过这套系统的处理 。下面是我对C++的I/O流的一些个人理解。💾

  • 写到cerr上的信息是不能被重定向的。

  • .I/O标准流类:头文件为iostream.h;C++的名字为cin,cout,cerr,clog。文件流类:头文件fstream.h,ofstream,ifstream,fstream。串流类:头文件strstrea.h。ostrstream,istrstream,strstream。

  • 控制符,用流对象的成员函数控制输出的格式,用控制符。流成员函数的优点是可以返回以前的设置,便于恢复设置。

5.控制符,用流对象的成员函数控制输出的格式,用控制符。流成员函数的优点是可以返回以前的设置,便于恢复设置。cin遇到空格等分隔符就会为一个接收单元,getline为cin的成员函数,能够读取已整行的文本。cin.get不跳过任何空白字符。

6.cin遇到空格等分隔符就会为一个接收单元,getline为cin的成员函数,能够读取已整行的文本。cin.get不跳过任何空白字符。

七、模板:

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。我们可以使用模板来定义函数和类,接下来是我记录的一些个人理解。🏢

  • 用函数模板可以将许多重载函数简单的归为一个。要是重载函数和模板函数同时存在,则先进行重载函数的匹配,然后再寻求模板的匹配。

  • 模板类:template <class T> class 类名{这里边就用T来表示这个数据类型};之后的里边成员函数的实现:template <class T> 返回值 类名<T>::函数名(形参)。

  • 使用类的模板方法:(1)在程序开始的头文件说明模板的定义。(2)在适当的地方创建一个模板类的实例,编译发现正在创建一个类模板对象的时候,便会创建该模板类的定义,同时,创建对应的对象实体。(3)有了对象名,以后的使用就和通常一样,但是要记住,你规定了什么类型的模板类,在使用成员函数的时候,所赋的实参也要对应该类型。

下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>using namespace std;template <class T>
class Stack { private: vector<T> elems;     // 元素 public: void push(T const&);  // 入栈void pop();               // 出栈T top() const;            // 返回栈顶元素bool empty() const{       // 如果为空则返回真。return elems.empty(); } 
}; template <class T>
void Stack<T>::push (T const& elem) 
{ // 追加传入元素的副本elems.push_back(elem);    
} template <class T>
void Stack<T>::pop () 
{ if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); }// 删除最后一个元素elems.pop_back();         
} template <class T>
T Stack<T>::top () const 
{ if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); }// 返回最后一个元素的副本 return elems.back();      
} int main() 
{ try { Stack<int>         intStack;  // int 类型的栈 Stack<string> stringStack;    // string 类型的栈 // 操作 int 类型的栈 intStack.push(7); cout << intStack.top() <<endl; // 操作 string 类型的栈 stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1;} 
}

八、异常

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。try 块中放置可能抛出异常的代码,catch 关键字用于捕获异常。下面是笔者在学习这段内容时候的一些笔记:💊

  • 错误一种为编译错误,另一种为运行中发现的错误,它分为不可预测的逻辑错误和可以预测的运行异常。在c++中,异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象。

  • .C++只理会受监控过程之异常,在try块之后必须紧跟一个或多个catch()语句,目的是对发生的异常进行处理。catch()括号中的声明只能容纳一个形参,当类型与抛掷异常的类型匹配的时候,该catch()块便称捕获了一个异常而转到其块中进行异常处理。

  • 异常的规则:(1)任意数量的catch分程序立即出现在try分程序之后,在try分程序出现之前,不能出现这些catch程序块。(2)跟在Catch之后圆括号中必须包含有数据类型,捕获是利用数据类型匹配实现的。(3)如果一个函数抛一个异常,但是在通往异常处理函数的调用链中找不到与之匹配的catch,则该程序调用一个abort()函数终止调用。这个参数必须是严格匹配(4.)如果catch分程序执行完毕,则跟随最后catch分程序的代码(如果有的话)就被执行。

  • 一个对象不含数据成员,则没有必要给捕获对象一个名字。抛掷的异常如果在try内,正常匹配catch语句,如果不在,则向上游的catch语句去匹配。如果上游也没有,则C++将执行默认的异常处理函数。

相关文章:

面向对象程序(C++)设计基础

一、类&对象C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。类提供了对象的蓝图&#xff0c;所以基本上&#xff0c;对象是根据类来创建的。声明类的对象&#xff0c;就像声明基本类型…...

conda安装nodejs版本过低解决方法

conda命令直接安装nodejs时&#xff0c;可能会由于镜像源中nodejs版本过低导致没法安装高本版的nodejs&#xff0c;导致无法jupyterlab使用一些扩展插件。 解决方法如下&#xff1a;&#xff08;windows环境下直接按提示下载版本安装就行&#xff0c;此处只介绍linux环境的解决…...

前端工程师leetcode算法面试必备-二分搜索算法(下)索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…...

使用Autowired为什么会被IDEA警告,应该怎么修改最佳

问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 &…...

面向对象(中)

面向对象&#xff08;中&#xff09; 一、 面向对象之继承性 继承性的好处 减少代码的冗余&#xff0c;提高了代码的复用性。 便于功能的扩展。 为多态性的使用&#xff0c;提供了前提。 继承性的格式 class A extends B{} A&#xff1a;子类、派生类、subclass B&#xff1a…...

【云原生】promehtheus整合grafana实现可视化监控实战

文章目录前言一. 实验环境二. 安装grafana2.1 grafana的介绍2.2 为什么选择grafana&#xff1f;2.3 grafana下载及安装三. 网页端配置grafana3.1 浏览器访问grafana网页3.2 使用grafana 获取prometheus的数据源3.3 grafana导入prometheus模板总结前言 大家好&#xff0c;又见面…...

Linux 内核定时器实验

目录 一、内核时间管理简介 二、内核定时器简介 三、驱动编写 1、修改makefile 2、添加定义 3、初始化led函数 4、添加调用 5、初始化定时器与定时器处理函数 这部分代码如下 四、ioctl函数 五、内核添加unlocked_ioctl 函数 1、添加设备操作集unlocked_ioctl成员 2…...

喜欢大屏电视?那就选择酷开系统,实现智能生活享受

随着科技的发展和我们生活水平的提高&#xff0c;越来越多的消费者开始认可并习惯使用各种高质量的科技产品&#xff0c;比如喜欢玩游戏的消费者&#xff0c;他们往往会追求流畅性更强、刷新率更快的大显示屏&#xff0c;以此获得更真实刺激的游戏体验&#xff0c;而喜欢追剧的…...

PMP应该如何备考?

备考之初的我们&#xff0c;总会四处搜索PMP备考经验&#xff0c;希望能拿到那些高分通关前辈的备考经验和方法。众所周知PMP考试因为有35个学时培训的基本要求&#xff0c;所以肯定是要通过培训机构报名的。 一&#xff0c;首先我们需要了解到新的考纲 1.PMP模块划分发生变化…...

AcWing《蓝桥杯集训·每日一题》—— 3956.截断数组

AcWing《蓝桥杯集训每日一题》—— 3956. 截断数组 文章目录AcWing《蓝桥杯集训每日一题》—— 3956. 截断数组一、题目二、解题思路三、代码实现本次博客我是通过Notion软件写的&#xff0c;转md文件可能不太美观&#xff0c;大家可以去我的博客中查看&#xff1a;北天的 BLOG…...

Docker的数据管理

一、管理docker容器中数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。 1、 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻…...

RxJS处理异步数据流

什么是异步? 异步&#xff08;Asynchronous&#xff09;指的是不同步发生的事件或操作。通常&#xff0c;同步操作是指一系列代码按照顺序依次执行&#xff0c;直到当前代码块执行完毕后才继续执行下一个代码块&#xff1b;而异步操作则是指某些代码会被提交到后台执行&#…...

IP地址与用户行为

IP地址能够解决网络风险和提高网络安全的原因是&#xff1a;所有的网络请求都会带有IP信息&#xff0c;是访问者的独立标识&#xff0c;另外ip地址的分配和管理比较严格&#xff0c;难以造假。另外ip属于网络层&#xff0c;可以轻松的对其进行阻断。现有的各种网络安全、负载均…...

底层逻辑2

有些创业者&#xff0c;在3D打印⽕爆的时候做3D打印&#xff0c;在VR&#xff08;虚拟现 实&#xff09;蓬勃发展的时候转⾏做VR&#xff0c;在区块链成为热⻔话题的时候摇身⼀ 变成了区块链专家&#xff0c;⽽⼈⼯智能⽕了以后&#xff0c;他们⼜全身⼼投⼊⼈⼯智 能这⼀⾏。再…...

TCP报头详解及TCP十种核心机制(一)

目录 前言&#xff1a; TCP报头 TCP核心机制 一、确认应答 二、超时重传 小结&#xff1a; 前言&#xff1a; 这篇文章详细介绍了TCP报头中的一些核心数据&#xff0c;及两种TCP核心机制。其他的一些机制会在后面文章中详细介绍。 TCP报头 解释&#xff1a; 1&#xff…...

Linux用户的添加、修改和删除以及相关配置文件:useradd、passwd、usermod、userdel、相关配置文件

目录 账户的创建&#xff08;useradd&#xff09; 第一步&#xff1a;创建账号 第二步&#xff1a;创建密码 useradd参考文件 CROUP100 HOME/home INACTIVE-1 EXPIRE SHELL/bin/bash SKEL/etc/skel UID/GID密码参数参考&#xff1a;/etc/login.defs 密码参数显示命…...

进程地址空间

目录 回顾C/C语言的程序地址空间 感性认识虚拟地址空间 虚拟地址空间与物理空间如何建立映射关系 为什么要虚拟地址空间&#xff1f; 回顾C/C语言的程序地址空间 在学习C/C语言时我们知道了一个概念叫程序地址空间。通俗来说就是如下一张表&#xff0c;从中可以得知系统的几…...

数楼梯(加强版)

数楼梯(加强版) 题目背景: 小明一天放学回家,看到从1楼到2楼共有n个台阶,因为好奇,他想尝试一下总共有几种方案到二楼?他可以1步,2步,3步的跳,不能跳3步以上. 他试了很多次都没有解决这个问题,于是请求聪明的你帮忙解决这个问题. 题目描述: 1楼到2楼楼梯有n级台阶。小明每…...

MySQL-数据类型

数据类型简介数据表由多列字段构成&#xff0c;每一个字段指定了不同的数据类型&#xff0c;指定了数据类型之后&#xff0c;也就决定了向字段插入的数据内容。不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式&#xff0c;以及在使用它们的时候选择什么运算符号进行运…...

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II&#xff08;java解题&#xff09;1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...