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/bash

if [ -f ./Makefile ]
then
        make clean
fi

cmake .

make

echo "---------------------------------"

./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/bash

if [ -f ./Makefile ]
then
        make clean
fi

cmake .

make

echo "---------------------------------"

./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/bash

if [ -f ./Makefile ]
then
        make clean
fi

cmake .

make

echo "---------------------------------"

./pro

check_mem.sh

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro

clean.sh

#!/bin/bash

rm -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);            //++i
                bool 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/bash

if [ -f ./Makefile ]
then
        make clean
fi

cmake .

make

echo "---------------------------------"

./pro

clean.sh

#!/bin/bash

rm -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/bash

if [ -f ./Makefile ]
then
        make clean
fi

cmake .

make

echo "---------------------------------"

./pro

check_mem.sh

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes -s ./pro

clean.sh

#!/bin/bash

rm -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;
}

 结果示例:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

行人检测技术:思通数科大模型在自动驾驶安全中的应用

在自动驾驶技术飞速发展的今天&#xff0c;行人检测已成为确保道路交通安全的关键技术之一。本文将探讨如何结合思通数科大模型和计算机视觉技术&#xff0c;实现在城市交通环境中对行人的高效检测&#xff0c;为自动驾驶车辆提供必要的行人安全保障。 引言 行人检测技术是利…

Dubbo内部通信流程

我当时在学习的过程中搭建过demo&#xff0c;具体流程就是&#xff0c;我先定义了一个api接口模块&#xff0c;还定义一个服务提供者模块&#xff0c;然后服务提供方实现该接口&#xff0c;定义该方法具体的实现impl类&#xff0c;服务提供方启动时&#xff0c;将要暴露的服务和…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

跨阻放大器

#创作灵感# 最近涉及到微电流的监测项目&#xff0c;而里面的核心就是跨阻放大器&#xff0c;所以这里做一个简单的介绍&#xff0c;后续等项目完成了&#xff0c;再做一个实例的介绍。 #正文# 跨阻放大器&#xff08;Transimpedance Amplifier, TIA&#xff09;是一种将输入电…

Windows编程之多线程事件对象(Event Object)用法详解

目录 一、前言 二、基础用法 三、API详解 1.创建事件对象 2控制事件状态 3.等待事件对象&#xff1a; 四、实战案例 1.案例描述 2.代码设计 3.总设计代码 4.运行结果 一、前言 事件对象&#xff08;Event Object&#xff09;是我们在大型项目中&#xff0c;进行多线…

股价持续低迷,业绩颓势不减,冀光恒难救平安银行?

文&#xff5c;新熔财经 作者&#xff5c;宏一 周一一上班&#xff0c;就听到旁边的同事感慨今年股市行情很不错&#xff0c;尤其是银行股&#xff0c;上半年累计上涨了17.02%&#xff0c;是涨幅最大的板块。 听到这里&#xff0c;我美滋滋地打开自己的账户&#xff0c;结…

如何对低代码平台进行分类?

现在市面上的低代码平台就像雨后春笋一样冒出来&#xff0c;而且源源不绝&#xff0c;但总结下来&#xff0c;大致的也就以下三类。 一、 aPaaS多引擎类&#xff08;有很多成熟引擎、做好东西要一起用&#xff09; 这类产品包括&#xff1a;织信Informat&#xff08;国内&…

照明物联网:基于网关的智能照明云监控系统解决方案

智能照明系统就是利用物联网技术&#xff0c;将同一空间的照明、空调、新风、排风等系统共同接入物联网平台&#xff0c;实现了“设备互联、数据互通”的智慧物联能力。照明数据、环境监测数据通过网关上传云端&#xff0c;在云端进行统计分析并将结果通过各种终端共享&#xf…

MySQL—常用的数据类型

数据类型 整型 1.创建一个含有无符号/有符号整型的字段的表 CREATE TABLE L1(id tinyint unsigned #无符号 ) CREATE TABLE L2(id tinyint #默认为有符号 ) 数值型(bit) 2.数值型(bit)的使用 小数 3.数值型(小数)的基本使用 字符串 4.字符串的基本使用 #演示字符串类型…

REGX52.H报错

keil cannot open source input file "REGX52.H": No such file or directory 选择下面这个目录 Keil\C51\INC\Atmel

AI绘画Stable Diffusion 新手入门教程:万字长文解析Lora模型的使用,快速上手Lora模型!

大家好&#xff0c;我是设计师阿威 今天给大家讲解一下AI绘画Stable Diffusion 中的一个重要模型—Lora模型&#xff0c;如果还有小伙伴没有SD安装包的&#xff0c;可以看我往期入门教程2024最新超强AI绘画Stable Diffusion整合包安装教程&#xff0c;零基础入门必备&#xff…

【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理&#xff1a; 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

手把手家教你进行ChatGPT私有化部署

背景 随着AI技术的不断成熟&#xff0c;加上ChatGPT如火如荼的发布新版本迭代更新&#xff0c;人工智能的热度也升温到史无前例的高度。 我们有理由相信&#xff0c;现在身边还不愿主动去接触这项技术&#xff0c;深入了解的小伙伴&#xff0c;在不久的将来&#xff0c;一定会…

网络攻防——kali操作系统基本使用

1.阅读前的声明 本文章中生成的木马带有一定的攻击性&#xff0c;使用时请遵守网络安全相关的法律法规&#xff08;恶意攻击操作系统属于违法行为&#xff09;。 2.环境安装 生成木马主要需要如下工具&#xff1a;kali操作系统&#xff0c;VMware15&#xff08;搭建kali操作…

用Python制作动态钟表:实时显示时间的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制钟表函数主循环 完整代码 引言 动态钟表是一种直观且实用的UI元素&#xff0c;能够实时显示当前时间。在这篇博客中&#xff0c;我们将使用Python创建一个动态钟表&#xff0c;通过利用Pygame库来实…

无线物联网题集

测试一 未来信息产业的发展在由信息网络向 全面感知和 智能应用两个方向拓展、延伸和突破。 各国均把 物联网作为未来信息化战略的重要内容,融合各种信息技术,突破互联网的限制,将物体接入信息网络。 计算机的出现,开始了第四次工业革命,开始了人机物的高度融合&#xff08;&…

LVS负载均衡群集部署之——DR模式的介绍及搭建步骤

一、LVS-DR集群介绍1.1 LVS-DR 工作原理1.2 数据包流向分析1.3 LVS-DR 模式的特点1.4 LVS-DR中的ARP问题1.4.1 问题一1.4.2 问题二二、构建LVS-DR集群2.1 构建LVS-DR集群的步骤&#xff08;理论&#xff09;1.配置负载调度器&#xff08;192.168.80.30&#xff09;&#xff08;…

护眼指南之适合学生写作业的台灯:看看学生护眼台灯哪个品牌好

随着人们健康意识的提高&#xff0c;越来越多的人开始关注眼睛的健康问题&#xff0c;照明技术的进步也为缓解眼疲劳提供了可能&#xff0c;现在的照明产品可以通过调整光线亮度、色温、频闪等参数&#xff0c;使光线更加柔和、均匀&#xff0c;减少眼睛的不适感。人们都希望通…

重生奇迹MU 最动听的声音 最精彩的游戏

在重生奇迹MU的世界里&#xff0c;每个玩家都是重生奇迹的见证者&#xff0c;同时也是重生奇迹的创造者。每个玩家都有属于自己的冒险故事&#xff0c;每时每刻都会有新的喜悦降临。这款神奇的游戏让人沉浸于冒险的精彩中&#xff0c;实在引人入胜。 “叮”的一声让你倍感喜悦…

<Linux> 多线程

文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位&#xff0c;线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是…