c->c++(二):class
本文主要探讨C++类的相关知识。
构造和析构函数
构造函数(可多个):对象产生时调用初始化class属性、分配class内部需要的动态内存
析构函数(一个):对对象消亡时调用回收分配动态内存
C++提供默认构造和析构,构造函数可重载,析构函数不需重载
构造和析构函数不需要返回值类型,构造函数可带参或不带参,析构函数不带参
无其他构造函数时默认构造函数可省略,有构造函数时默认构造函数不能省
class声明时可给构造函数形参赋默认值,调用时不传参则使用默认值,调用不能有重载歧义
所有参数都带默认值构造函数,可以表示所有构造函数
拷贝构造函数:用对象来初始化对象,函数不需重载
浅拷贝:普通成员变量初始化的拷贝构造函数(默认提供),有动态内存分配时出错
深拷贝:浅拷贝无法拷贝对象的成员指针已分配的内存空间,深拷贝可以
拷贝显式提供copy constructor为深拷贝,拷贝构造函数用原来的析构函数
权限
public类内、类外可访问,子类可访问父类公共成员
protected类内可访问,类外不可,子类可访问父类保护成员
private类内可访问,类外不可,子类不可访问父类私有成员
默认是private继承,struct是public继承
继承中父类所有权限继承给子类
public继承:父类成员在子类中保持原有访问权限
private继承:父类成员在子类中变为private权限
protected继承:父类public变protected,protected为protected,private为private
using:private/protected继承父类public中成员后权限变小,可通过using回归到public权限
struct和class
C不支持成员函数,C++支持
C不支持static成员,C++中支持
C默认public,C++默认public,c++可指定public/private/protected权限
C不支持继承(通过包含结构体指针实现),C++支持且struct和class可互相继承
C++中struct和class:struct默认public,class默认private,struct和class交叉继承权限取决子类
派生类和基类
派生类不继承基类构造和析构函数,只继承成员变量和成员方法,派生类有自己构造和析构
派生类构造函数执行前,先调用基类构造函数,再调用自己构造函数
派生类先执行自己析构函数,再执行基类析构函数
派生类覆盖基类同名成员(重定义),父类的同名成员存在且被隐藏,可通过全域路径调用被隐藏的方法,可添加派生类独有成员
派生类是基类的超集,基类对象放大成派生类可能出错,派生类赋值给基类可正常使用(类似char和int的兼容性)
多继承二义性和多态
C多继承A和B,A和B有同名成员、菱形继承(B1:A, B2:A, C:B1,B2)造成二义性
全域路径调用方法,重定义子类方法,重写虚函数解决二义性
基类方法声明为virtual,派生类重写同名方以实现多态
重载函数名相同参数列表不同,重定义子类实现父类同名方法后把父类方法隐藏
重写子类去实现父类同名virtual方法实现多态特性
虚函数
抽象类:有纯虚函数的类,抽象类只能为基类派生新类,不可实例化对象
派生类必须实现基类纯虚函数才能用于实例化对象,否则派生类仍为基类
接口:类中所有成员函数是public且是纯虚函数
无虚构造函数,包含虚函数的类只能作为基类派生新类,无法实例化对象,构造函数是在实例化的时候被调用的,故无虚构造函数
抽象基类(接口)指针指向派生类(new派生类对象:person *p = new man; delete p;),抽象基类(接口)析构函数需要为虚,才可删除指针时能正确调用派生类析构函数,否则不会调用派生类析构函数
抽象基类(接口)指针指向派生类(定义好的派生类man m;person *p = &m;),抽象基类(接口)析构函数是否为虚,都能正常调用派生类析构函数,一般抽象基类(接口)的析构函数都定义为虚
运算符重载
运算符重载是重定义对象运算符对应函数
赋值运算符=默认提供,重载有指针成员时涉及浅拷贝和深拷贝
++a对应Type& operator++(void);
a++,对应Type& operator++(int x);
不可重载运算符: .,.*, ->*,sizeof,?,:,#
静态成员
静态成员属于class本身,不属于对象
静态成员变量在类的多个对象中均可访问,且是同一个
静态成员变量和方法可以用对象调用,也可不产生对象的本身调用
静态数据成员不在类中初始化,类只定义模版
静态数据成员不在类构造函数中初始化,构造函数用于构建对象时初始化对象成员
静态数据成员值默认0,遵循public,private,protected访问准则
静态方法只访问静态成员变量和方法,不能直接访问非静态,需要通过函数传参访问非静态
静态成员变量可用于统计对象数
静态类:内部全是静态成员,不能被实例化,不包括构造函数,不能实现接口(不能被继承),不能有实例成员
静态类成员不能有protected或protected internal访问保护修饰符
友元函数
友元函数不是本类成员函数,是外部函数
友元函数在private或protected或public都可
可以通过类来访问友元函数,不能直接通过友元函数访问类(常用传参访问)
友元函数破坏了封装机制,实现类之间数据共享时减少系统开销,提高效率
运算符重载可用友元函数除=,->,[],()
类间的数据共享可用友元函数
demo1:
类成员权限,构造和析构函数,深拷贝和浅拷贝
目录:
run.sh
#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #最低版本要求SET(CMAKE_CXX_COMPILER "g++") #设置g++编译器PROJECT(CLASS) #设置工程名MESSAGE(STATUS "class test") #打印消息ADD_EXECUTABLE(pro main.cpp person.cpp) #生成可执行文件
person.hpp
#ifndef __PERSON_HPP__
#define __PERSON_HPP__#include <iostream>using namespace std;namespace People
{class Person{public:string name;int age;string sex;string description;int *luck_num;Person();Person(string name = "xxx",int age = 0,string sex = "none",string description = "none");Person(const Person &p);~Person();void set_info(string name,int age,string sex,string description);void print_info();void set_income(int income);int get_income();void set_savings_account(int savings_account);int get_savings_account();private:int income;int savings_account;};}#endif
person.cpp
#include "person.hpp"
#include <iostream>using namespace std;void People::Person::set_info(string name,int age,string sex,string description)
{this->name = name;this->age = age;this->sex = sex;this->description = description;
}void People::Person::print_info()
{cout << "name :" << this->name << endl;cout << "age :" << this->age << endl;cout << "sex :" << this->sex << endl;cout << "description :" << this->description << endl;cout << "income " << get_income() << endl;cout << "savings_account " << get_savings_account() << endl;cout << "luck_num : " << this->luck_num[0] << " " << this->luck_num[1] << endl;
}void People::Person::set_income(int income)
{this->income = income;
}int People::Person::get_income()
{return this->income;
}void People::Person::set_savings_account(int savings_account)
{this->savings_account = savings_account;
}int People::Person::get_savings_account()
{return this->savings_account;
}People::Person::Person()
{cout << "default constructor function" << endl;
}People::Person::Person(string name,int age,string sex,string description):name(name),age(age),sex(sex),description(description)
{this->luck_num = new int[2];cout << "user define constructor function" << endl;
}People::Person::~Person()
{delete [] this->luck_num;cout << "user define destructor function" << endl;
}
People::Person::Person(const Person &p):name(p.name),age(p.age),sex(p.sex),description(p.description)
{luck_num = new int(*p.luck_num);cout << "user define deep copy constructor function" << endl;
}
main.cpp
#include <iostream>
#include "person.hpp"using namespace std;
using namespace People;int main()
{Person p1("xiaoming",23,"male","high");p1.set_income(50);p1.set_savings_account(100);p1.luck_num[0] = 2;p1.luck_num[1] = 7;p1.print_info();Person p2(p1);p2.set_income(20);p2.set_savings_account(10);p2.luck_num[0] = 36;p2.luck_num[1] = 72;p2.print_info();Person p3 = p2;p3.set_income(10);p3.set_savings_account(40);p3.luck_num[0] = 5;p3.luck_num[1] = 8;p3.print_info();return 0;
}
结果示例:
demo2:
继承和多态,虚函数,抽象类,接口
目录:
run.sh
#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro
check_mem.sh
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #最低版本要求SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") #添加编译选项PROJECT(CLASS) #设置工程名MESSAGE(STATUS "class test") #打印消息ADD_EXECUTABLE(pro main.cpp person.cpp man.cpp) #生成可执行文件
person.hpp
#ifndef __PERSON_HPP__
#define __PERSON_HPP__#include <iostream>
using namespace std;namespace People
{class Person{public:string name;int age;void print_info();Person();Person(string name,int age);~Person();private:int income;protected:};class person{public:string name;virtual void play() = 0;virtual ~person();};class machine{public:virtual void introduce() = 0;virtual ~machine();};}#endif
person.cpp
#include "person.hpp"
#include <iostream>
using namespace std;void People::Person::print_info()
{cout << "name : " << this->name << endl;cout << "age : " << this->age << endl;
}People::Person::Person()
{cout << "Person constructor" << endl;
}People::Person::Person(string name,int age):name(name),age(age)
{cout << "user define Person constructor" << endl;
}People::Person::~Person()
{cout << "Person destructor" << endl;
}People::person::~person()
{cout << "user define person desturctor" << endl;
}People::machine::~machine()
{cout << "machine virtual function" << endl;
}
man.hpp
#ifndef __MAN_HPP__
#define __MAN_HPP__
#include "person.hpp"class Man:public People::Person
{public:string description;void do_job();void print_info();Man();Man(string name,int age,string description);~Man();private:protected:
};class man:private People::Person
{public:using Person::name;using Person::age;using Person::print_info;
};class gamer:public People::person
{public:void play();gamer();~gamer();
};class sportsman:public People::person
{public:void play();sportsman();~sportsman();
};class robot:public People::machine
{public:void introduce();robot();~robot();
}; #endif
man.cpp
#include "man.hpp"
#include <iostream>
using namespace std;void Man::do_job()
{cout << this->name << " working" << endl;
}void Man::print_info()
{cout << "name :" << this->name << endl;cout << "age :" << this->age << endl;cout << "description :" << this->description << endl;
}void gamer::play()
{cout << this->name << " playing game" << endl;
}gamer::gamer()
{cout << "user define gamer consturctor function" << endl;
}gamer::~gamer()
{cout << "user define gamer desturctor function" << endl;
}sportsman::sportsman()
{cout << "user define sportsman consturctor function" << endl;
}sportsman::~sportsman()
{cout << "user define sportsman desturctor function" << endl;
}void sportsman::play()
{cout << this->name << " playing ping-pong" << endl;
}void robot::introduce()
{cout << "i am robot" << endl;
}robot::robot()
{cout << "robot consturctor function" << endl;
}robot::~robot()
{cout << "robot desturctor function" << endl;
}Man::Man()
{cout << "man constructor" << endl;
}Man::Man(string name = "xxx",int age = 0,string description = "xxx"):Person(name,age),description(description)
{cout << "user define man constructor" << endl;
}Man::~Man()
{cout << "man destructor" << endl;
}
main.cpp
#include "person.hpp"
#include "man.hpp"using namespace People;
using namespace std;int main()
{Man m1; //父类构造->子类构造->子类析构->父类析构Man m2("xiaoming",23,"height");m2.print_info();m2.do_job();m2.Person::print_info(); //全域路径访问隐藏父类方法Person p1 = m2; //子类初始化父类p1.print_info();man m3;m3.name = "xiaohua";m3.age = 27;m3.print_info(); //using放开保护继承(class A :private/protected B)//需要保证抽象基类的析构函数为虚才能正常调用派生类析构函数person *p = new gamer;p->name = "gamer";p->play();delete p;//抽象基类的析构函数是否为虚都能调用派生类析构函数sportsman s;s.name = "sportsman";person *t = &s;t->play();//接口和抽象基类的析构函数一般定义为虚robot r;r.introduce();return 0;
}
结果示例:
demo4:
运算符重载
目录:
run.sh
#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro
check_mem.sh
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro
clean.sh
#!/bin/bashrm -rf CMakeFiles pro Makefile CMakeCache.txt cmake_install.cmake
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #最低版本要求SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") #添加编译选项PROJECT(CLASS) #设置工程名MESSAGE(STATUS "class test") #打印消息ADD_EXECUTABLE(pro main.cpp) #生成可执行文件
main.cpp
#include <iostream>using namespace std;class coordinate
{public:int *px;int *py;coordinate();coordinate(const coordinate &cd);coordinate(int x,int y);~coordinate();void print_coordinate();coordinate operator+(const coordinate & other);coordinate operator=(const coordinate & other);coordinate operator++(int x); //i++coordinate operator++(void); //++ibool operator==(const coordinate & other);friend void operator+=(coordinate & a,const coordinate & b); //友元函数只能传参方式调用类成员
};coordinate::coordinate()
{this->px = new int(0);this->py = new int(0);
}coordinate::coordinate(int x,int y)
{this->px = new int(x);this->py = new int(y);
}coordinate::coordinate(const coordinate &cd)
{cout << "copy" << endl;this->px = new int(*(cd.px));this->py = new int(*(cd.py));
}coordinate::~coordinate()
{delete this->px;delete this->py;
}void coordinate::print_coordinate()
{cout << "(" << *(this->px) << "," << *(this->py) << ")" << endl;return;
}coordinate coordinate::operator+(const coordinate & other)
{cout << "+" << endl;coordinate tmp;*(tmp.px) = *(this->px) + *(other.px);*(tmp.py) = *(this->py) + *(other.py);return tmp;
}coordinate coordinate::operator=(const coordinate & other)
{cout << "=" << endl;if(this != &other){*(this->px) = *(other.px);*(this->py) = *(other.py);}return *this;
}coordinate coordinate::operator++(void)
{*(this->px) += 1;*(this->py) += 1;return *this;
}coordinate coordinate::operator++(int x)
{coordinate tmp;*(tmp.px) = *(this->px);*(tmp.py) = *(this->py);*(this->px) += 1;*(this->py) += 1;return tmp;
}void operator+=(coordinate & a,const coordinate & b)
{*(a.px) += *(b.px);*(a.py) += *(b.py);return;
}bool coordinate::operator==(const coordinate & other)
{if(*(this->px) == *(other.px) && *(this->py) == *(other.py))return true;return false;
}int main()
{coordinate c1(1,1);coordinate c2(2,2);cout << "------------3" << endl;coordinate c3;c3 = c1 + c2; //先定义再赋值时,先调用加法,在调用自定义=,在调用自定义拷贝(深浅拷贝均相同,浅拷贝时若为定义=和拷贝,则调用默认)c3.print_coordinate();cout << "------------4" << endl;coordinate c4 = c1 + c2; //只调用+(深浅拷贝均相同)c4.print_coordinate();cout << "------------5" << endl;coordinate c5 = c1; //调用自定义拷贝(浅拷贝调用默认)c5.print_coordinate();cout << "------------6" << endl;coordinate c6(c1); //调用自定义拷贝(浅拷贝调用默认)c6.print_coordinate();cout << "tmp------------7" << endl;coordinate tmp;coordinate c7;tmp = c7++;tmp.print_coordinate();cout << "tmp------------8" << endl;coordinate c8;tmp = ++c8;tmp.print_coordinate();cout << "------------9" << endl;coordinate c9(1,1);operator+=(c9,c9);c9.print_coordinate();cout << "------------10" << endl;coordinate c10(1,1);bool res = (c10 == c1);cout << boolalpha << res << endl;return 0;
}
结果示例:
demo5:
类静态成员
目录:
run.sh
#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro
clean.sh
#!/bin/bashrm -rf CMakeFiles pro Makefile CMakeCache.txt cmake_install.cmake
check_mem.sh
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #最低版本要求SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") #添加编译选项PROJECT(CLASS) #设置工程名MESSAGE(STATUS "class test") #打印消息ADD_EXECUTABLE(pro main.cpp) #生成可执行文件
main.cpp
#include <iostream>using namespace std;class Person
{public:string name;Person();Person(string name);static int objetcion_num;static void print_obj_num();static void print_name(string name); //静态方法传参访问非静态成员};//静态类
class constant
{public:static int week_day_num; //一周的天数static int earth_radius; //地球半径static void print_info();
};int constant::week_day_num = 7;
int constant::earth_radius = 6371;void constant::print_info()
{cout << "days of the week :" << constant::week_day_num << endl;cout << "radius of the earth :" << constant::earth_radius << endl;
}int Person::objetcion_num = 0; //<==>int objetcion_num;//类中静态成员的访问方式
Person::Person()
{objetcion_num++;
}Person::Person(string name)
{this->name = name;this->objetcion_num++;
}void Person::print_obj_num()
{cout << "obj_num :" << Person::objetcion_num << endl;
}void Person::print_name(string name)
{cout << "person name :" << name << endl;
}int main()
{//类外静态成员的访问方式Person p1;cout << "obj_num :" << p1.objetcion_num << endl;Person p2("xaioming");cout << "obj_num :" << Person::objetcion_num << endl;Person p3("xaiohua");p3.print_obj_num();constant::print_info();return 0;
}
结果示例:
demo6:
友元函数,友元类
目录:
run.sh
#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro
check_mem.sh
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro
clean.sh
#!/bin/bashrm -rf CMakeFiles pro Makefile CMakeCache.txt cmake_install.cmake
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #最低版本要求SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") #添加编译选项PROJECT(CLASS) #设置工程名MESSAGE(STATUS "class test") #打印消息ADD_EXECUTABLE(pro main.cpp) #生成可执行文件
main.cpp
#include <iostream>using namespace std;//前置申明解决友元类未定义
class Father;
class Son;class Father
{public:string name;int age;Father();Father(string name,int age);void print_name(string name);friend class Son;
};class Son
{public:string name;int age;Son();Son(string name,int age);void print_age(int age);friend class Father;};Father::Father(string name,int age)
{this->name = name;this->age = age;
}void Father::print_name(string name)
{cout << name << endl;
}Son::Son(string name,int age)
{this->name = name;this->age = age;
}void Son::print_age(int age)
{cout << age << endl;
}int main()
{Father f("xiaoming",40);Son s("xiaohua",20);f.print_name(s.name);s.print_age(f.age);return 0;
}
结果示例:
相关文章:

c->c++(二):class
本文主要探讨C类的相关知识。 构造和析构函数 构造函数(可多个):对象产生时调用初始化class属性、分配class内部需要的动态内存 析构函数(一个):对对象消亡时调用回收分配动态内存 C提供默认构造和析构,…...

11 UDP的可靠传输协议QUIC
1.如何做到可靠性传输 2.UDP与TCP,我们如何选择 3.UDP如何可靠,KCP协议在哪些方面有优势 4.KCP协议精讲(重点讲解 5.OUIC时代是否已经到来 UDP如何做到可靠传输 ACK机制重传机制 重传策略序号机制(后发的包可能先到) 3 2 1-> 2 3 1重排机制 2 3 1-> 3 2 1窗口机制 流…...

14-20 Vision Transformer用AI的画笔描绘新世界
概述 毫无疑问,目前最受关注且不断发展的最重要的主题之一是使用人工智能生成图像、视频和文本。大型语言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它们在文本生成方面的许多问题已得到解决。然而,LLM 面临的一个主要挑战是它们有时会产生幻觉反应。 最近推出的新模…...

LVS FILTER UNUSED OPTION
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 过滤一些版图与spice网表对不上的器件。 一般后端遇不到这个问题,因为通常是需要写到网表中的decap没有写出来造成的,如下图。...
Python后端面试题
1. 文件操作w和r的区别 在Python中,文件操作模式中的w和r都表示对文件的读写操作,但它们在打开文件时的行为有所不同: r模式: 读写:这种模式允许你同时读取和写入文件。文件必须已经存在,否则会抛出一个Fi…...
docker打包 arm32v7/debian 问题总结
1.架构不同 我的宿主是x86 ,但是打包的是arm架构 安装qemu sudo apt-get install binfmt-support qemu qemu-user-static 然后使用buildx打包 docker buildx build --no-cache --platform linux/arm/v7 -t tdc_post:1.0.1 . --load 保存tar docker save -o tdc_post.tar tdc_p…...

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十)
课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 30 节) P30《29.数据持久化-用户首选项》 实现数据持久化在harmonyOS中有很多种方式,比较常见的是以下两…...
Vuetify3:监听当前手机还是电脑
我们在开发的时候,实现根据移动设备或PC设备来改编一些交互样式,这个时候我们需要监听宽度,在Vuetify3中可我们可以参考 显示 & 平台配合监听即可在窗口缩小的时候判断出手机还是电脑 <template><v-app><div v-if…...

Zabbix 配置钉钉告警
Zabbix 配置钉钉告警 随着企业IT运维需求的不断增加,及时、准确地获取系统告警信息显得尤为重要。在众多告警工具中,Zabbix 因其强大的监控功能和灵活的告警机制,成为了很多企业的首选。同时,随着企业内部沟通工具的多样化&#…...
TTL转RS232与USB转TTL
USB转TTL是一种常用的通信接口转换器,它将USB(通用串行总线)接口转换为TTL(晶体管-晶体管逻辑)电平的串行接口。这种转换器在许多场景下非常有用: USB转TTL: 功能: 将计算机的USB接…...
【力扣 896】单调数列 C++题解(循环)
如果数组是单调递增或单调递减的,那么它是 单调 的。 如果对于所有 i < j,nums[i] < nums[j],那么数组 nums 是单调递增的。 如果对于所有 i < j,nums[i]> nums[j],那么数组 nums 是单调递减的。 当给定…...
代码随想录Day71(图论Part07)
53.寻宝 题目:53. 寻宝(第七期模拟笔试) (kamacoder.com) 思路:首先,我不知道怎么存这样的东西,用三维数组吗,没搞懂,果断放弃 prim算法实现 import java.util.*;class Main {publi…...
[Mdp] lc 494. 目标和(01背包变种+dp+dfs)
文章目录 1. 题目来源2. 题目解析1. 题目来源 链接:494. 目标和 2. 题目解析 方法一:dfs 数据量比较小,长度只有 20,那么针对每一个数都有两种选择,正、负,即 2 20 = 100 w 2^{20} = 100w 220=100w 差不多的时间复杂度,dfs 解决即可。时间复杂度: O ( 2 n ) O(2^{n…...
React vs Vue:谁是构建现代Web应用的王者?
在前端开发领域,React 和 Vue 是两大备受推崇的框架(React实为库),各自拥有庞大的社区和丰富的生态系统。本文旨在深入探讨这两者之间的区别,通过代码示例来分析它们各自的优势和适用场景,从而帮助开发者做…...

Linux CentOS 宝塔中禁用php8.2的eval函数详细图文教程
PHP_diseval_extension 这个方法是支持PHP8的, Suhosin禁用eval函数,不支持PHP8 一、安装 cd / git clone https://github.com/mk-j/PHP_diseval_extension.gitcd /PHP_diseval_extension/source/www/server/php/82/bin/phpize ./configure --with-php-config/ww…...
Matlab 中 fftshift 与 ifftshift
文章目录 【 1. fftshift、ifftshift 的区别】【 2. fftshift(fft(A)) 作图 】【 3. fftshift(fft(A)) 还原到 A 】Matlab 直接对信号进行 FFT 的结果中,前半部分是正频,后半部分是负频,为了更直观的表示,需要将 负频 部分移到 前面。【 1. fftshift、ifftshift 的区别】 M…...
被裁了(9年)
那年(2015年)我刚毕业有一年多(20出头),阴差阳错来到了现在的单位。 那时互联网腾起,单位也迅速发展,部门从起初的不到30号人发展到500人;A轮、B轮.....D轮,一轮轮的融资…...

13. Revit API: Filter(过滤器)
13. Revit API: Filter(过滤器) 前言 在讲Selection之前,还是有必要先了解一下的过滤器的。 对了,关于查找一些比较偏的功能或者API的用法,可以这样查找 关键词 site:https://thebuildingcoder.typepad.com/ site是…...
hadoop 3.X 分布式HA集成Kerbos(保姆级教程)
前提:先安装Kerbos 1、创建keytab目录 在每台机器上上提前创建好对应的kertab目录 [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /BigData/run/hadoop/keytab/ [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /opt/security/ [hadooptv3-hadoop-01 ~]$ sudo chown hadoop:had…...

VDS虚拟导播切换台软件
VDS 导播软件是一款功能强大的虚拟导播系统软件,具有全媒体接入、播出内容丰富、调音台、快捷切播与导播键盘、云台控制等特点,同时支持向多个平台直播推流。以下是一些常见的 VDS 导播软件特点: 1. 全媒体接入:支持多种设备和网…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...