(C++)类与对象

2023-05-16

目录

一、类与对象的思想

1、类和对象的概念

2、类的访问控制

3、类中的元素说明

4、类的实际使用

二、对象的构造和析构函数

1、构造函数

2、构造函数的重载与调用

3、拷贝构造函数

4、深度拷贝

5、默认构造函数

6、析构函数

7、匿名对象

8、对象的动态创建和释放

9、构造函数的形参初始化列表

三、静态成员变量和静态成员函数

1、静态成员变量

2、静态成员函数

四、友元函数与友元类

1、友元函数

2、友元类


一、类与对象的思想

面向对象的特点:封装、继承、多态

面向对象编程的特点:

(1)易维护:可读性高,即使改变了需求,由于继承的存在,只需要对局部模块进行修改,维护起来非常方便,维护的成本也比较低。

(2)质量高:可以重用以前项目中已经被测试过的类,使系统满足业务需求从而具有更高的质量

(3)效率高:在软件开发时,根据设计的需求要对现实世界的事物进行抽象,从而产生了类

(4)易扩展:由于继承、封装、多态的特性,可设计出高内聚、低耦合的系统结构,使系统更加灵活、更容易扩展,而且成本也比较低。

1、类和对象的概念

c++是一门面向对象的语言,理解c++,首先要理解类和对象

c++中的类可以看成c语言中的结构体的升级版,,结构体是一种构造类型,可以包含若干个成员变量,成员变量的类型可以不同。

关于class(类)的几点说明:

(1)类的定义的最后有一个分号,它是类的一部分,表示类定义结束,不能省略。

(2)一个类可以创建多个对象,每个对象都是一个变量

(3)类是一种构造类型,大小的计算方法和struct一样,需要字节对齐

(4)类成员变量的访问方法:通过 .或者->来访问

(5)成员函数是类的一个成员,出现在类中,作用范围由类来决定,而普通函数是独立的,作用范围是全局或者某个命名空间

struct :内部默认是共有权限,结构体外部可以访问其内部成员

class:内部默认是私有权限,类的外部不能直接访问内部成员;可以手动声明为共有权限;

2、类的访问控制

public:公有属性,凡是在它下面声明的变量和函数,都可以在类的内部和外部访问

private:私有属性,凡是在它下面声明的变量和函数,只能在类的内部访问

protected:保护属性,凡是在它下面声明的变量和函数,只能在类的内部以及派生类(子类)中访问

3、类中的元素说明

类中有成员变量(属性)、成员函数(方法);

类可以创建对象;

4、类的实际使用

举例:创建一个学生类(成员变量:年龄、姓名;成员方法:年龄输入、年龄输出)

注意:一个类中必须有输入输出

头文件:student.h(含类创建)

//student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <iostream>
using namespace std;
class Student
{
    public:
        int GetAge();   //声明类的成员函数,在函数的其它地方实现
        int SetAge(int age);
    private:
        int m_age;
        char m_name[32];
};
#endif

方法体:student.cpp

//Student.cpp
#include "student.h"
int Student::GetAge()
{
    return m_age;
}
int Student::SetAge(int age)
{
    m_age = age;
}

主函数:main.cpp

//main.cpp
#include "student.h"
int main(int argc, char const *argv[])
{
    Student s1;
    s1.SetAge(18);
    cout<<s1.GetAge()<<endl;
    return 0;
}

练习1:设计一个立方体类,求出立方体的面积(2ab + 2ac + 2bc)和体积(a*b*c),并且判断两个立方体是否相等

要求: 私有成员变量:长宽高

成员函数(方法):求面积,求体积,设置长宽高

全局函数:判断两个立方体是否相等

头文件:cube.h(含类创建)

#ifndef _CUBE_H_
#define _CUBE_H_
#include <iostream>
using namespace std;
class Cube
{
private:
    int m_length;
    int m_wide;
    int m_high;
public:
//求面积
    int GetArea();
//求体积
    int GetVolume();
//设置长宽高
    void SetCube(int length,int wide,int high);
//获取长度
    int GetLength();
//获取高度
    int GetHight();
//获取宽度
    int GetWide();
};
bool CubeIsEqual(Cube c1, Cube c2);
#endif

方法体:cube.cpp

#include "cube.h"

int Cube::GetArea()
{
    int MyArea = 2*m_high*m_length + 2*m_high*m_wide + 2*m_length *m_wide;
    return MyArea;
}

int Cube::GetVolume()
{
    return m_high*m_length*m_wide;
}

void Cube::SetCube(int length,int wide,int high)
{
    m_length = length;
    m_wide = wide;
    m_high = high;
}

//获取长度
int Cube::GetLength()
{
    return m_length;
}

//获取高度
int Cube::GetHight()
{
    return m_high;
}

//获取宽度
int Cube::GetWide()
{
    return m_wide;
}

bool CubeIsEqual(Cube c1, Cube c2)
{
    if(c1.GetHight() == c2.GetHight() && c1.GetLength() == c2.GetLength() && c1.GetWide() == c2.GetWide())
    {
        return true;
    }
    else
    {
        return false;
    }
}

主函数:main.cpp

#include "cube.h"

int main(int argc, char const *argv[])
{
    Cube c1,c2;   //创建对象
    c1.SetCube(1,2,3);
    c2.SetCube(1,3,2);
    cout<<"c1的面积是:"<<c1.GetArea()<<endl;
    cout<<"c2的面积是:"<<c2.GetArea()<<endl;

    cout<<"c1的体积是:"<<c1.GetVolume()<<endl;
    cout<<"c2的体积是:"<<c2.GetVolume()<<endl;

    if(CubeIsEqual(c1,c2))
    {
        cout<<"c1 = c2"<<endl;
    }
    else
    {
        cout<<"c1 != c2"<<endl;
    }
    return 0;
}

练习2:设计一个圆形类和一个点类,计算点和圆的关系

要求:

1> 点类 属性:横坐标和纵坐标

方法:点和点之间的距离计算

           设置横坐标,纵坐标

2> 圆形类 属性:半径 ,圆心 、

方法:计算点和圆的关系

           设置半径和圆心

头文件:circle.h(含类创建)

#ifndef _CIRCLE_H_
#define _CIRCLE_H_
#include <iostream>
using namespace std;

class Point
{
private:
    int m_x;
    int m_y;
public:
    void setXY(int x,int y);
    int Distance(Point &p);    
};
class Circle
{
    private:
        Point m_center;
        int m_r;
    public:
        void SetC(int x,int y,int r);
        bool Judge(Point &p);
};

#endif

方法体:circle.cpp

#include "circle.h"

void Point::setXY(int x,int y)
{
    m_x = x;
    m_y = y;
}

int Point::Distance(Point &p)
{
    int dis = (p.m_x - m_x)*(p.m_x - m_x) + (p.m_y - m_y) *(p.m_y - m_y);
    return dis;
}

void Circle::SetC(int x,int y,int r)
{
    m_center.setXY(x,y);
    m_r = r;
}

bool Circle::Judge(Point &p)
{
    if(p.Distance(m_center) >= m_r *m_r)
    {
        return true;
    }
    else
    {
        return false;
    }
}

主函数:main.cpp

#include "circle.h"
int main(int argc, char const *argv[])
{
    Point p;
    p.setXY(0,3);
    Circle c1;
    c1.SetC(0,0,2);
    if(c1.Judge(p))
    {
        cout<<"点在圆上或者圆外"<<endl;
    }
    else
    {
        cout<<"点在圆内"<<endl;
    }
    return 0;
}

二、对象的构造和析构函数

1、构造函数

在c++中,由一种特殊的成员函数,名字和类名相同,没有返回值,不需要用户显示调用(用户也不能调用),而是在创建对象的时候自动调用。 这种函数我们称为构造函数 关于构造函数:

1.函数名必须和类型相同

2.不能有返回值,函数体不能有return语句

3.构造函数在定义对象时会自动调用,不需要手动调用

#include <iostream>
#include <cstdlib>
using namespace std;

class Array
{
    private:
        int *m_data;   //数组的起始地址
        int m_size;
    public:
        Array();  //无参构造函数,函数名和类名一致,没有返回值
        void SetVal(int Index,int Val);
        int GetVal(int Index);
        ~Array();  //析构函数,函数名为:~类名 ,没有返回值,没有参数
};

Array::Array()
{
    cout<<"Array的无参构造函数"<<endl;
    m_size = 5;
    m_data = (int *)malloc(sizeof(int) *m_size);
}

Array::~Array()
{
    cout<<"Array的析构函数"<<endl;
    if(m_data != NULL)
    {
        free(m_data);
        m_data = NULL;
    }
}

int main(int argc, char const *argv[])
{
    Array a1; //创建对象,会自动调用构造函数

    return 0;
}

2、构造函数的重载与调用

和普通函数一样,构造函数是允许重载的,一个类可以有多个重载的构造函数,在创建对象时根据传递实参来判断调用哪一个构造函数

#include <iostream>
#include <cstdlib>
using namespace std;

class Array
{
    private:
        int *m_data;   //数组的起始地址
        int m_size;
    public:
        Array();  //无参构造函数,函数名和类名一致,没有返回值
        Array(int s);  //有参构造函数
        Array(int s,int z);  //有两个参数的构造函数

        ~Array();  //析构函数,函数名为:~类名 ,没有返回值,没有参数
};

Array::Array()
{
    cout<<"Array的无参构造函数"<<endl;
    m_size = 5;
    m_data = (int *)malloc(sizeof(int) *m_size);
}

Array::Array(int s)  //有参构造函数
{
    cout<<"Array的有一个参数的构造函数"<<endl;
    m_size = s;
    m_data = (int *)malloc(sizeof(int) * m_size);
}

Array::Array(int s,int z)  //有两个参数的构造函数
{
    cout<<"Array的有两个参数的构造函数"<<endl;
    m_size = s;
    m_data = (int *)malloc(sizeof(int) * m_size);
}

Array::~Array()
{
    cout<<"Array的析构函数"<<endl;
    if(m_data != NULL)
    {
        free(m_data);
        m_data = NULL;
    }
}

int main(int argc, char const *argv[])
{
    //Array a1(6);    //括号法
    //Array a2(1,2);  //调用两个参数的构造函数
    //Array a1 = 7;   //等号法
    Array a3 = (1,2);  //逗号表达式
    return 0;
}

3、拷贝构造函数

(1)概念

用一个现有的对象去初始化另一个对象

声明:Array(const Array &a); //拷贝构造函数

(2)拷贝构造函数的调用时机

1.用一个对象初始化另一个的对象

Array a1(a3);

Array a1 = a3;

Array a1 = Array(a3);

2.当函数的形参是一个对象时,例如:

void print(Array a)  //Array a = a1;

{    

        a.GetVal(1);

}

3. 函数的返回值是一个对象

Array& Func()

{    

        Array a1;    

        return a1;

}

#include <iostream>
#include <cstdlib>
using namespace std;

class Array
{
    private:
        int *m_data;   //数组的起始地址
        int m_size;
    public:
        Array();  //无参构造函数,函数名和类名一致,没有返回值
        Array(const Array &a);  //拷贝构造函数

        ~Array();  //析构函数,函数名为:~类名 ,没有返回值,没有参数
};

Array::Array()
{
    cout<<"Array的无参构造函数"<<endl;
    m_size = 5;
    m_data = (int *)malloc(sizeof(int) *m_size);
}


Array::Array(const Array &a)
{
    cout<<"Array的拷贝构造函数"<<endl;
}

Array::~Array()
{
    cout<<"Array的析构函数"<<endl;
    if(m_data != NULL)
    {
        free(m_data);
        m_data = NULL;
    }
}

void print(Array a)  //Array a = a1;
{
    a.GetVal(1);
}

Array& Func()
{
    Array a1;
    return a1;
}
int main(int argc, char const *argv[])
{
    //Array a1;
   // Array a2 = a1;
    //print(a1);
    Array a2 = Func();
    return 0;
}

4、深度拷贝

深度拷贝:数据和内存空间都要拷贝;

Array::Array(const Array &a)   //深拷贝
{
    cout<<"Array的拷贝构造函数"<<endl;
    m_size = a.m_size;
    m_data = (int *)malloc(sizeof(int) * m_size);
    for(int i = 0 ; i < m_size;i++)
    {
        m_data[i] = a.m_data[i];
    }
}

5、默认构造函数

当使用者没有提供构造函数,系统会提供默认构造函数;

当使用者提供了构造函数:

(1)提供了无参构造函数,编译器将不会再提供默认无参构造函数

(2)提供了有参构造函数,系统将不再提供无参构造函数

#include <iostream>
using namespace std;
class Demo
{
public:
    /*Demo()  //一旦提供了无参构造函数,编译器将不会再提供默认无参构造函数
    {
        cout<<"无参构造函数"<<endl;
    }*/
    Demo(int a)    //一旦提供了有参构造函数,系统将不再提供无参构造函数
    {
        cout<<"DemO的有参构造函数"<<endl;
    } 
};

int main(int argc, char const *argv[])
{
    Demo d;  //会提供默认的构造函数
    Demo d1 = d;  //会提供默认的拷贝构造函数
    return 0;
}

6、析构函数

创建对象时系统会调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数进行清理工作,如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。

格式:

~类名(); //析构函数

注意:析构函数没有参数,不能被重载,一个类只能有一个析构函数,如果用户没有定义析构函数,编译器会提供默认的析构函数。

#include <iostream>
#include <cstdlib>
using namespace std;
class Array
{
    private:
        int *m_data;   //数组的起始地址
        int m_size;
    public:
        Array();  //无参构造函数,函数名和类名一致,没有返回值
        Array(const Array &a);  //拷贝构造函数
  
        ~Array();  //析构函数,函数名为:~类名 ,没有返回值,没有参数
};

Array::~Array()
{
    cout<<"Array的析构函数"<<endl;
    if(m_data != NULL)
    {
        free(m_data);
        m_data = NULL;
    }
}

int main(int argc, char const *argv[])
{
    //Array a1;
   // Array a2 = a1;
    //print(a1);
    Array a2 = Func();
    return 0;
}

7、匿名对象

类名()//匿名对象,代码执行完毕,立即释放(不用到return)

#include <iostream>
using namespace std;
class Test
{
    public:
        Test()
        {
            cout<<"Test的无参构造函数"<<endl;
        }
        ~Test()
        {
            cout<<"Test的有参构造函数"<<endl;
        }
};
int main(int argc, char const *argv[])
{
    Test();   //匿名对象,本行代码执行完,立即被释放
    cout<<"*******************"<<endl;
    return 0;
}

8、对象的动态创建和释放

new和delete:

#include <iostream>
#include <cstdlib>
using namespace std;
class Test
{
    public:
        Test()
        {
            cout<<"Test的无参构造函数"<<endl;
        }
        Test(int a)
        {
            cout<<"有一个参数的构造函数"<<endl;
        }
        ~Test()
        {
            cout<<"Test的有参构造函数"<<endl;
        }
};
int main(int argc, char const *argv[])
{
    //Test * t1 = (Test *)malloc(sizeof(Test));
    //free(t1);
    Test *pt = new Test(1);  //会自动调用构造函数
    delete pt;       //会自动调用析构函数
    return 0;
}

9、构造函数的形参初始化列表

使用情形:

//对象的初始化列表:

(1)类对象作为成员变量并且该类没有提供无参构造函数

(2)成员变量为const修饰

#include <iostream>
using namespace std;
class Date
{
private:
    int m_year;
    int m_month;
    int m_day;
public:
   
    Date(int y,int m,int d)
    {
        cout<<"Date的有参构造函数"<<endl;
        m_year = y;
        m_month = m;
        m_day = d;
    }
};

//对象的初始化列表:1.类对象作为成员变量并且该类没有提供无参构造函数 2.成员变量为const修饰
class Student
{
    private:
        const int m_id;
        Date birth;
    public:
    Student(int y,int m,int d,int i):birth(y,m,d),m_id(i) 
    {
        cout<<"Student的有参构造函数"<<endl;
    }
};

int main(int argc, char const *argv[])
{
    Student s1(1998,5,6,100);
    return 0;
}

三、静态成员变量和静态成员函数

1、静态成员变量

(1)普通函数可以访问静态成员变量

(2)静态成员变量一定要在类的外部初始化

(3)静态成员变量可以直接通过类名来访问

在c++中,静态成员变量属于某个类,而不属于某个对象,我们可以使用静态成员变量来实现多个对象共享数据的目标

class Student

{

        static int m_num;

};

2、静态成员函数

(1)静态成员函数中只能访问静态成员变量,不能访问普通变量

(2)静态成员函数中的静态成员变量可以通过类名访问

(3)普通成员函数不能通过类名访问

#include <iostream>
using namespace std;
class Student
{
    public:
        static int count;
    private:
        int id;
    public:
        Student()
        {
            count++;
            id = count;
        }
        int GetCount() //普通函数可以访问静态成员变量
        {
            return count;   
        }
        static int GetCount1() //静态成员函数
        {
            return count;    //静态成员函数中只能访问静态成员变量,不能访问普通变量
        }
};
int Student::count = 0;  //静态成员变量一定要在类的外部初始化
int main(int argc, char const *argv[])
{
    Student s1;
    Student s2;
    cout<<s1.count<<endl;
    cout<<s2.count<<endl;
    cout<<Student::count<<endl;   //静态成员变量可以直接通过类名来访问
    cout<<Student::GetCount1()<<endl;
    cout<<s1.GetCount()<<endl;
    return 0;
}

四、友元函数与友元类

1、友元函数

在当前类的外部定义、不属于当前类的函数也可以在类中声明,但是要在前面加关键字friend, 这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。

友元函数可以访问当前类中的所有成员,包括public、protected、private等属性的成员。      

#include <iostream>
using namespace std;

class Test
{
    friend void show(Test &t);  //将show函数声明为Test的友元,show可以访问Test的所有成员变量
    private:
        int m_a;
    public:
        void set(int a)
        {
            m_a = a;
        }
};

void show(Test &t)
{
    cout<<t.m_a<<endl;
}

int main(int argc, char const *argv[])
{
    Test t1;
    t1.set(2);    
    show(t1);    //通过友元函数可以访问,Test类中的所有成员。
    return 0;
}

2、友元类

如果将类B声明为类A的友元类,那么类B中的所有成员函数都是类A的友元函数,类B就可以访问类A的所有成员,包括public、protected、private属性成员。

#include <iostream>
using namespace std;

class A
{
    friend class B;  //声明B为A的友元,友谊具有单向性,不代表A是B的友元,破坏了他的封装性
    private:
    int m_a;
    public:
        void set(int a)
        {
            m_a = a;
        }
};

class B
{
    private:
        int m_b;
    public:
        void print(A &a)
        {
            cout<<"m_a = "<<a.m_a<<endl;
        }
};

int main(int argc, char const *argv[])
{
    A a1;
    a1.set(2);

    B b1;
    b1.print(a1);   //当B成为A的友元类后,类B的所有成员函数都是A的友元函数,所以通过B的函数
    return 0;       //可以访问A中所有成员。
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(C++)类与对象 的相关文章

  • 【剑指offer系列】剑指offer 03-06

    这次我们来讲解剑指offer的全部题目 xff0c 今天是第一天 xff0c 我们来讲解第三题到第六题 xff08 我也不清楚为什么力扣上查不到第一题和第二题 xff09 一 剑指offer 03 题目链接 xff1a 力扣 题目描述 xf
  • 什么是scrum中的3355

    scrum的3355是指 xff1a 3个工件 xff1a 产品Backlog Sprint Backlog 潜在可交付软件增量 3个角色 xff1a PO Master 团队 xff08 最适合人数为7 2到7 43 2之间 xff09
  • 搭建ant+jenkins+jmeter自动化接口测试框架(详细篇)

    引言 为什么要持续集成 1 减少风险 2 减少假定 3 减少重复过程 4 增强项目的可见性 5 持续集成可以带来两点积极效果 xff1a 1 有效决策 xff1a 持续集成系统为项目构建状态和品质指标提供了及时的信息 xff0c 有些持续集
  • Linux C生产者和消费者(线程)

    生产者和消费者 生产者消费者问题实现目标原理代码 生产者消费者问题 生产者消费者共享缓冲区 xff0c 生产者向缓冲区中放数据 xff0c 消费者从缓冲取中取数据 xff0c 当缓冲区中被放满时 xff0c 生产者进程就必须进入挂起状态 x
  • HPE DL388GEN9 /windows server 2012r2 重置管理员密码/忘记管理员密码

    有台HPE DL388GEN9 windows server 2012r2的主机 xff0c 不知道密码 从CSND上查了有人可以通过U盘PE进去用工具去改掉 实测 xff0c 难以进入PE xff08 也可能是我操作有问题 xff09 x
  • ArchLinux,ManjaroLlinux安装,运行Android软件。安装anbox(详细)

    安装anbox我也是用了一个下午的时间来进行安装 xff0c 因此我做了一下总结 xff0c 方便大家安装 这个安装教程arch和manjaro都是可以实现的 xff0c 因为manjaro是arch的分支 xff0c 同样也可以使用anb
  • ArchLinux的安装(BIOS引导方式安装)

    archlinux的安装对于很多新手朋友很不友好 xff0c 于是我对archlinux的安装做了一下整理 xff0c 方便大家安装 安装之前我们需要准备一下 xff1a archlinux的镜像iOS文件 U盘 xff0c 或者虚拟机 脑
  • 汇编语言,and、or指令

    and 和 or指令 and指令 xff0c 作用按位与运算 mov ax 1011 1100b mov bx 1100 1011b and ax bx ax的结果为 xff1a 1000 1000 or指令 xff0c 作用 xff1a
  • 解决wget错误:ERROR: The certificate of ‘xxx’ is not trusted.

    使用wget出现以下错误 wget https github com mozilla geckodriver releases download v0 31 0 geckodriver v0 31 0 linux64 tar gz ERRO
  • git 报错SSL certificate problem: unable to get local issuer certificate解决办法

    git中的SSL certificate problem unable to get local issuer certificate错误的解决办法 uManBoy 这是由于当你通过HTTPS访问Git远程仓库的时候 xff0c 如果服务器
  • Linux 对整个系统备份和还原

    对系统进行备份非常的重要 xff0c 如果有一天 xff0c 系统崩溃了 xff0c 可以重装系统 xff0c 但是重装系统后又需要进行相关的配置 xff0c 这会显得非常的麻烦 xff0c 又会浪费很多的时间 备份的方式 xff1a 分两
  • Win11安装python-3.11.1

    注意整个安装过程需要联网 xff01 xff01 xff01 python 3 11 1下载地址 xff1a https www python org ftp python 3 11 1 python 3 11 1 amd64 exe 1
  • 三分钟记住20道性能测试经典面试题

    1 什么是性能测试 xff1f 测试系统有没有性能问题 考虑时间 xff0c 空间 服务端资源是否足够 响应时间是否超时 系统是否足够稳定 2 性能测试的应用领域有哪些 xff1f 能力验证 xff1a 乙方向甲方交付项目时 xff0c 声
  • C++ 对数组的快速排序算法

    include 34 stdio h 34 交换两个数 void swap int amp a int amp b int t 61 a a 61 b b 61 t 根据第一个数 xff0c 把小于第一个数的数放在前面 xff0c 把打印第
  • C++ 广度优先搜索,搜索二叉树,并且打印

    广度优先搜索 xff08 BFS xff09 什么是广度优先搜索 广度优先搜索就是层序遍历 xff0c 一层一层的搜索整个图 BFS的代码实现 使用数组实现静态的二叉树 xff0c 树的结构如下显示 代码如下显示 include 34 st
  • C++ 得到下一天的年月日的函数

    include 34 iostream 34 include 34 string 34 include 34 stdio h 34 using namespace std 得到下一个日期 void next day int amp year
  • 树莓派使用Thonny学习笔记1

    来C站这么久了 xff0c 最近在初学树莓派Raspberry Pi PIco 所以想在C站记录一下自己的学习过程 xff0c 到时候能回头看看自己的学习之路 今天学习了如何新建全局变量与按键输入模式 xff0c 和IO的输出模式配置 xf
  • error while loading shared libraries: librosconsole.so: cannot open shared object file: No such file

    错误背景 xff1a linux下运行ros相关文件出错 错误意思 xff1a Linux下这个的错误的大概意思还是路径问题 xff0c 要么是你下载的库真的不存在 xff0c 要么是没有添加环境变量 xff0c 不过大多数都属于后者 一
  • Python之多线程爬虫实践

    多线程爬虫实践 一 多线程的介绍及threading的基本使用1 什么是多线程 xff1f 2 如何创建一个基本的多线程 xff1a 二 使用Thread类创建多线程1 查看当前线程2 继承自threading Thread类 三 多线程共
  • 对比学习孪生网络之简单的手写数字集代码实战

    对比学习孪生网络 注 xff1a 大家觉得博客好的话 xff0c 别忘了点赞收藏呀 xff0c 本人每周都会更新关于人工智能和大数据相关的内容 xff0c 内容多为原创 xff0c Python Java Scala SQL 代码 xff0

随机推荐

  • Linux驱动框架学习——I2C驱动体系

    最近打算写一个Camera项目 xff0c 涉及调试内核 优化开机 从启动到获取第一帧图像的时间 xff0c 因为在查看Camera相关内核源码后发现底层Camera总线是类似I2C的 xff0c 所以结合 正点原子驱动开发指南 和 Lin
  • 关于IMX6ULL挂载内核失败解决办法(2)Retry count exceeded; starting again

    目录 开发板 xff1a 问题Bug xff1a 解决办法一 xff1a xff08 最初问题定位 xff1a Ubuntu的IP重复导致 xff09 解决办法二 xff1a xff08 放弃tftp xff0c 改用nfs xff09 开
  • 【基于IMX6ULL开发板开机摄像头的自启动】

    项目场景 xff1a 这里简述项目相关背景 xff1a 最近在准备暑期实习和秋招 xff0c 准备一个Camera项目 xff0c 涉及调试内核 优化开机 从启动到获取第一帧图像的时间 xff0c 硬件平台为正点原子IMX6ULL开发板 x
  • 上海青浦区大众驾校(科目二·自动挡)真实考场操作全程

    上海大众驾校真实考场 xff0c 科目二 xff08 自动挡 xff09 xff0c 考试过程 xff1a 零 考试开始准备工作 xff1a 1 开始考试 xff0c 监考员会将车子摆正对准开进考场的箭头路标 xff0c 上车系安全带 调座
  • Linux多进程/线程编程之【fork()和exec()】

    目录 一 fork系统调用创建子进程 1 1 为什么要创建子进程 1 2 fork系统调用的内部原理 1 3 关于子进程 1 4 线程和fork 二 exec族函数及实战 2 1 为什么需要exec族函数 2 2 exec族的6个函数介绍
  • C++手撕 ACM——换座位-桌椅高度(取模运算)

    大三寒假要结束了 xff0c 继续备战秋招 xff0c 年前刷了些双指针 数组 链表的简单LeetCode题 xff0c 都没有做笔记 xff0c 现在也忘得差不多了 xff0c 计划写一份专栏记录刷题的过程 xff0c 复盘算法中的细节
  • C++手撕LeetCode——二叉树遍历(BFS层序遍历)

    大三寒假要结束了 xff0c 继续备战秋招 xff0c 年前刷了些双指针 数组 链表的简单LeetCode题 xff0c 都没有做笔记 xff0c 现在也忘得差不多了 xff0c 计划写一份专栏记录刷题的过程 xff0c 复盘算法中的细节
  • C++手撕LeetCode——双指针(滑动窗口)

    大三寒假要结束了 xff0c 继续备战秋招 xff0c 年前刷了些双指针 数组 链表的简单LeetCode题 xff0c 都没有做笔记 xff0c 现在也忘得差不多了 xff0c 计划写一份专栏记录刷题的过程 xff0c 复盘算法中的细节
  • 消息队列及常见消息队列介绍

    转载 消息队列及常见消息队列介绍 一 消息队列 MQ 概述 消息队列 xff08 Message Queue xff09 xff0c 是分布式系统中重要的组件 xff0c 其通用的使用场景可以简单地描述为 xff1a 当不需要立即获得结果
  • WIN10专业版修改用户名名字

    有时候一些软件不支持中文路径 xff0c 这个时候中文用户名就很绝望 xff0c 所以给出修改的视频链接以及坑 链接 视频 坑 更换超级用户后 xff0c 转到超级会员admin时电脑黑屏 有鼠标箭头 xff0c 但是不显示桌面 xff0c
  • 套利套保模型|BVAR、ECM、GARCH、价差

    线性回归OLS BVAR ECM GARCH 价差套利 套利策略 套保比率 套保权重 套保绩效
  • Java x的平方根

    x 的平方根 简单 给你一个非负整数 x xff0c 计算并返回 x 的 算术平方根 由于返回类型是整数 xff0c 结果只保留 整数部分 xff0c 小数部分将被 舍去 注意 xff1a 不允许使用任何内置指数函数和算符 xff0c 例如
  • kvm的概念

    目录 1 KVM的概念 2 前期准备 3 案例实施 kvm的概念 KVM xff08 Kernel based Virtual Machine xff09 是一个开源软件 xff0c 基于内核的虚拟化技术 xff0c 实际是嵌入系统的一个虚
  • python 循环结构-for循环

    知识性的教程 xff0c 不能像小说那样对已知的线索进行七拐八绕的隐藏 xff0c 而应该开门见山地将所有的知识直接铺设在读者眼前 这也是本系列教程的编写宗旨 根据指定的循环次数是否有限 xff0c 循环语句可以分为有限循环语句和无限循环语
  • 【高频出现】测试工程师技能面试题目和答案

    一 sql相关 1 mysql存储过程与普通的sql语句区别 存储过程就是多条sql语句的集合 xff0c 由于它是在数据库端得sql语句 xff0c 所有执行起来很快 2 sql的常用语句 xff1a 1 新增 xff1a insert
  • 生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)

    目录 一 图解 xff0c 步步分解理论基础 1 1 使用锁 43 条件变量实现生产者消费者模式理论基础 1 2 使用信号量实现生产者消费者模式的理论基础 二 Linux环境下对于基于阻塞队列的两种实现方式 C版本 2 1 条件变量 43
  • 卸载anaconda后powershell 无法将“D:\anaconda\Scripts\conda.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    卸载anaconda后powershell 无法将 D anaconda Scripts conda exe 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 之前在电脑上安装了anaconda xff0c 配置还花了我半天没时间
  • shell编程、makefile学习笔记

    windows r n linux n 1 shell介绍 1 1 shell是操作系统的终端命令行 1 shell可以理解为软件系统提供给用户操作的命令行界面 xff0c 可以说它是人机交互的一种方式 2 我们可以使用shell和操作系统
  • 西瓜书线性模型课后题sklearn实现

    文章参考了线性模型文章 xff0c 笔者代码基础很差 xff0c 只使用sklearn对 机器学习 第三章课后习题3 3和3 5 xff0c 分别对应对数几率回归和线性判别分析模型做了简单实现 水平有限 xff0c 如有错误敬请指正 对数几
  • (C++)类与对象

    目录 一 类与对象的思想 1 类和对象的概念 2 类的访问控制 3 类中的元素说明 4 类的实际使用 二 对象的构造和析构函数 1 构造函数 2 构造函数的重载与调用 3 拷贝构造函数 4 深度拷贝 5 默认构造函数 6 析构函数 7 匿名