【五】【C++】类与对象(三)

news2024/11/28 16:50:05

const只读

在 C++ 中,const 关键字用于声明一个变量为常量,意味着一旦被初始化之后,它的值就不能被改变。

声明常量

使用 const 关键字可以声明变量为常量。这意味着这个变量的值不能被修改。

const int MAX_SIZE = 100;

指针与 const

const 可以与指针结合使用,用来声明指向常量的指针或者指针本身为常量。

指向常量的指针:不能通过这个指针来修改它所指向的值。

 
const int* ptr = &MAX_SIZE;

常量指针:指针本身的值(即存储的地址)不能被修改。

 
int value = 5;
int* const ptr = &value;

指向常量的常量指针:既不能修改指针存储的地址,也不能通过指针修改所指向的值。

 
const int* const ptr = &MAX_SIZE;

指针与const结合使用,主要看const后面紧跟着的是什么,如果紧跟着的是int* 数据类型,说明指针上的值不能改变,如果紧跟着的是指针名,说明指针本身不能改变,如果都存在,都无法改变。

const 成员函数:

在类中,如果一个成员函数不修改任何成员变量,那么这个函数可以被声明为 const

 
class MyClass {
public:
    int getValue() const {
        return value;
    }
private:
    int value;
};

const 与对象:

当一个对象被声明为 const,那么只能调用它的 const 成员函数。这是因为 const 成员函数保证不会修改对象的状态。

我们可以思考以下几个问题,

1. const对象可以调用非const成员函数吗?---const对象只能调用const成员函数

2. 非const对象可以调用const成员函数吗?---非const意味着可读可写,对于只读成员函数当然可以调用

3. const成员函数内可以调用其它的非const成员函数吗?---const成员函数不能修改成员变量,自然不能调用非const成员函数。

4. 非const成员函数内可以调用其它的const成员函数吗?---非const意味着可读可写,对于只读成员函数当然可以调用

初始化列表

在 C++ 中,初始化列表(Initializer List)是一个非常重要的特性,用于在构造函数中初始化类的成员变量。使用初始化列表可以提高代码的效率和可读性,并且在某些情况下是必要的。

基本语法

初始化列表紧随在构造函数的参数列表后面,由一个冒号 (:) 引入,后跟一个或多个用逗号分隔的初始化器。每个初始化器包括成员变量名称和用于初始化该成员的值或表达式。

 
/*初始化列表*/
#include <iostream>
using namespace std;
class Date {
    public:
        Date(int year, int month, int day)
            : _year(year)
            , _month(month)
            , _day(day)
        {}
        void Show() {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
 };
int main() {
    Date d1(2024, 1, 31);
    d1.Show();
 }

初始化列表相对于构造函数的优点

更高的效率

初始化列表直接初始化成员变量,而不是先默认构造它们然后再赋值。这在成员变量是对象时尤其重要,因为它避免了额外的构造和析构调用。

必要性

对于 const 成员和引用类型的成员变量,它们必须在初始化列表中初始化,因为这些类型的变量一旦被默认构造,就不能再被赋予新值。

初始化列表对于非基本数据类型的优势

对于类类型的成员变量,如果它们没有默认构造函数,或者有参数的构造函数更高效,使用初始化列表可以明确指定如何初始化这些成员。

对于const成员和引用类型的成员变量

 
/*构造函数的缺陷---难以初始化 const 和引用类型成员变量*/
#include <iostream>
using namespace std;
class A{
public:
    A(int& a){
        _ref= a;
        _n=10;
    }
private:
    int& _ref;
    const int _n;
 };

构造函数并不是严格意义上的初始化,上面代码尝试用构造函数初始化const和引用成员会报错,“[错误]在‘ int &’[-fpermissive ]中未初始化的引用成员”,原因是构造函数实际上是对已经初始化的成员变量进行赋值操作,也就是说成员变量已经被创建,但构造函数是对创建好的成员变量进行赋值操作。我们希望的初始化是在创建的过程中进行赋值操作。

对于const和引用成员,必须在创建的时候对其初始化,而构造函数是对创建好的对象进行赋值,因此只能使用初始化列表进行严格的初始化。

 
/*构造函数的缺陷---难以初始化 const 和引用类型成员变量*/
#include <iostream>
using namespace std;
class A {
    public:
        A(int& a):
            _ref(a),
            _n(10)
        {}
        void Show() {
            cout << _ref << "---" << _n << endl;
            cout << &_ref << endl;
        }
    private:
        int& _ref;
        const int _n;
 };
int main() {
    int b = 100;
    A a(b);
    cout << &b << endl;
    a.Show();
    return 0;
 }

对于自定义类型成员变量

 
/*初始化列表对于非基本数据类型的优势*/
#include <iostream>
using namespace std;
class A {
    public:
        A(int a): _a(a)
        {}
        void Show() {
            cout << "_a:" << _a << endl;
        }
    private:
        int _a;
 };
class B {
    public:
        B(int a, int ref)
            : _aobj(a),
              _ref(ref),
              _n(10)
        {}
        void Show() {
            _aobj.Show();
            cout << "_ref:" << _ref << endl << "_n:" << _n << endl;
        }
    private:
        A _aobj;
        int& _ref;
        const int _n;
 };
int main() {
    int c = 20;
    B b(100, c);
    b.Show();
 }

初始化列表的初始化顺序

成员变量的初始化顺序与它们在类中的声明顺序一致,而不是初始化列表中的顺序。这可以确保即使成员变量之间有依赖关系,它们也总是以一致的顺序被初始化。

 
/*初始化列表---初始化顺序*/
#include <iostream>
using namespace std;
class Date {
    public:
        Date(int year, int month, int day)
            : _year(year)
            , _month(month)
            , _day(day)
        {}
        void Show() {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _day;
        int _month;
        int _year;
 };
int main() {
    Date d1(2024, 1, 31);
    d1.Show();
 }

explicit 关键字

在 C++ 中,explicit 关键字用于阻止类构造函数的隐式自动类型转换。它主要用在类的单参数构造函数上,或者在构造函数有默认参数时,构造函数虽然有多个参数,但可以仅通过一个实际参数调用。

在没有 explicit 关键字的情况下,C++ 允许单参数构造函数隐式地将一个值转换为其类类型。这种隐式转换有时可能导致意料之外的行为。

 
/*explicit关键字*/
#include <iostream>
using namespace std;
class Date {
    public:
        Date(int year)
            : _year(year),
              _month(0),
              _day(0)
        {}
        Date& operator=(const Date& d) {
            if (this != &d) {
                _year = d._year;
                _month = d._month;
                _day = d._day;
            }
            return *this;
        }
        void Show() {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
 };
int main() {
    Date d1(2022);
    d1.Show();
    d1 = 2023;//Date d(2023)
    d1.Show();
    return 0;
 }

当我们将整型的2023传入d1时,发生隐式转换将整型2023转化为日期类,调用单参数构造函数,以整型2023为参数构造日期类作返回值。

此时在Date构造函数前面添加explicit关键字,阻止类构造函数的隐式自动类型转换。

 
/*explicit关键字*/
#include <iostream>
using namespace std;
class Date {
    public:
        explicit Date(int year)
            : _year(year),
              _month(0),
              _day(0)
        {}
        Date& operator=(const Date& d) {
            if (this != &d) {
                _year = d._year;
                _month = d._month;
                _day = d._day;
            }
            return *this;
        }
        void Show() {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
 };
int main() {
    Date d1(2022);
    d1.Show();
    d1 = 2023;//Date d(2023)
    d1.Show();
    return 0;
 }

static成员

在 C++ 中,static 关键字用于定义类的静态成员,包括静态成员变量和静态成员函数。这些成员与类的特定实例无关,而是属于类本身。

静态成员变量

类的静态成员变量在所有实例之间共享。也就是说,不管创建了多少对象,静态成员变量只有一份副本。

静态成员变量可以通过类名直接访问,而不需要类的实例。

静态成员变量必须在类定义外进行初始化(通常在源文件中)。

静态成员函数

静态成员函数可以访问类的静态成员变量和其他静态成员函数,但不能直接访问类的非静态成员。(静态函数没有this指针)

静态成员函数可以通过类名直接访问,而不需要类的实例。

 
/*静态static*/
#include<iostream>
using namespace std;
class A{
public:
    static void add(){
        n++;
    }

    static int n;

 };
int A::n=0;

int main(){
    cout<<A::n<<endl;
    A a;
    a.n++;
    A b;
    cout<<b.n<<endl;
    
     A::add();
    cout<<A::n<<endl;
 }

尝试在类内重载<<运算符

 
/*在类内 重载<<与>>运算符*/
#include <iostream>
using namespace std;
class Date {
    public:
        Date(int year, int month, int day)
            : _year(year),
              _month(month),
              _day(day)
        {}

        ostream& operator<<(ostream& _cout) {
            _cout << _year << "-" << _month << "-" << _day << endl;
            return _cout;
        }
    private:
        int _year;
        int _month;
        int _day;
 };
int main() {
    Date d1(2024, 1, 31);
    //_cout << d1 << endl;
    d1 << cout << endl;
 }

我们在类内重载<<运算符,以至于我们使用<<时,左边必须是Date类的对象,右边才是第一个参数_cout。因为<<左边的Date对象需要作为this指针传入operator<<函数中,正常来说我们希望<<左边作为_cout参数右边作为this指针传入函数内,因此在类内不便于我们重载<<与>>运算符。

尝试在类外重载<<运算符

 
/*在类内 重载<<与>>运算符*/
#include <iostream>
using namespace std;
class Date {
    public:
        Date(int year, int month, int day)
            : _year(year),
              _month(month),
              _day(day)
        {}


    private:
        int _year;
        int _month;
        int _day;
 };

ostream& operator<<(ostream& _cout, const Date& d) {
    _cout << d._year << "-" << d._month << "-" << d._day << endl;
    return _cout;
 }
int main() {
    Date d1(2024, 1, 31);
    cout << d1 << endl;
 }

在类外外面重载<<与>>运算符有一个严重的问题,无法在类外访问类内被private修饰的成员变量。

友元

在C++中,友元(Friend)是一种机制,它允许一个类或函数访问另一个类的私有成员。这意味着友元能够绕过C++中的封装性,使得外部类或函数可以直接访问另一个类的私有数据和成员函数。

类友元:

友元可以是一个类,这意味着一个类可以允许另一个类访问它的私有成员。

在一个类中声明另一个类为友元,可以在类的定义中使用 friend 关键字。

 
class ClassA {
private:
    int privateVarA;
public:
    ClassA() : privateVarA(0) {}
    friend class ClassB; // 声明ClassB为ClassA的友元
};

class ClassB {
public:
    void AccessPrivateVar(ClassA& obj) {
        obj.privateVarA = 42; // ClassB可以访问ClassA的私有成员
    }
};

函数友元

友元也可以是一个函数,这意味着一个函数可以访问一个类的私有成员。

在一个类中声明一个函数为友元,可以在类的定义中使用 friend 关键字。

 
class MyClass {
private:
    int privateVar;
public:
    MyClass() : privateVar(0) {}
    friend void FriendFunction(MyClass& obj); // 声明FriendFunction为MyClass的友元函数
};

void FriendFunction(MyClass& obj) {
    obj.privateVar = 42; // FriendFunction可以访问MyClass的私有成员
}

在类外重载<<运算符

 
/*在类内 重载<<与>>运算符*/
#include <iostream>
using namespace std;
class Date {
public:
    Date(int year, int month, int day)
    : _year(year),
    _month(month),
    _day(day)
    {}
    friend ostream& operator<<(ostream& _cout, const Date& d);
    
private:
    int _year;
    int _month;
    int _day;
 };

ostream& operator<<(ostream& _cout, const Date& d) {
    _cout << d._year << "-" << d._month << "-" << d._day << endl;
    return _cout;
 }
int main() {
    Date d1(2024, 1, 31);
    cout<<d1<<endl;
 }

在类内声明ostream& operator<<(ostream& _cout, const Date& d);这个函数是Date的友元函数。表示这个函数可以访问Date类内的私有成员。

内部类

在C++中,内部类(也称为嵌套类)是定义在另一个类中的类。这种结构允许组织代码的方式更加紧密和结构化,使得外部类和内部类之间的关系更加明确。内部类可以访问外部类的私有成员,这是因为C++标准规定内部类是外部类的友元。

定义内部类

内部类(嵌套类)是在另一个类的内部定义的类。这使得嵌套类能够访问外部类的所有成员(包括私有成员)。

 
class OuterClass {
public:
    // 外部类的成员

    class InnerClass {
    public:
        // 内部类的成员
    };
};

访问外部类成员

嵌套类可以直接访问外部类的成员,包括私有成员。因为C++标准规定内部类是外部类的友元。

 
class OuterClass {
    int value = 0; // 私有成员

public:
    class InnerClass {
    public:
        void display(OuterClass& outer) {
            cout << outer.value << endl; // 直接访问外部类的私有成员
        }
    };
};

实例化内部类

要实例化嵌套类,您首先需要外部类的实例,然后使用该实例来实例化内部类。

如果内部类是公有的,也可以直接从外部类的外部实例化它。否则,你可能需要在外部类内部或通过外部类的公有方法来实例化内部类。

 
/*内部类*/
#include <iostream>
using namespace std;
class OuterClass {
        int value = 0; // 私有成员

    public:
        class InnerClass {
            public:
                void display(OuterClass& outer) {
                    cout << outer.value << endl; // 直接访问外部类的私有成员
                }
        };
 };
int main() {
    OuterClass a;
    OuterClass::InnerClass b;
    b.display(a);

 }

匿名对象

在C++中,匿名对象是指没有名称的对象。它们通常在创建对象时立即使用,而不需要将其存储在变量中。匿名对象可以用于各种场景,比如作为函数参数、作为表达式的一部分或在任何只需要临时对象的地方。

匿名对象在使用后立即被销毁,这意味着它们的生命周期非常短。这使得它们在处理不需要长期存储的数据时非常有用。

作为函数参数

假设我们有一个函数display,它接受一个对象参数,并显示一些信息。我们可以在调用display时创建一个匿名对象:

 
#include <iostream>

class MyClass {
public:
    void show() const {
        std::cout << "MyClass show function called" << std::endl;
    }
};

void display(const MyClass& obj) {
    obj.show();
}

int main() {
    // 使用匿名对象作为函数参数
    display(MyClass());

    return 0;
}

类方法链式调用

在某些情况下,你可能想要立即调用一个对象的方法,而不是先将其存储在变量中。可以创建一个匿名对象来实现这一点:

 
#include<iostream>
class MyClass {
public:
    void show() const {
        std::cout << "MyClass show function called" << std::endl;
    }
};

int main() {
    // 创建一个匿名对象并立即调用它的方法
    MyClass().show();

    return 0;
}

短暂的生命周期

 
/*短暂的生命周期*/
#include<iostream>
using namespace std;
class A
{
public:
    A(int a = 0)
    :_a(a)
    {
        cout << "A(int a)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
private:
    int _a;
 };
int main(){
    A();
    
     return 0;
 }

匿名对象的生命周期只有一行。

拷贝构造优化

1.构造函数构造出来的对象A,用来拷贝构造一个对象B,优化成,构造函数直接构造出来的对象B(直接用对象A)

2.函数值返回一个对象A,优化成直接返回A,A用来拷贝构造一个对象B,优化成,直接用对象A,A生命周期延长。

/*拷贝构造的优化*/
#include <iostream>
using namespace std;
class A {
    public:
        A(int a = 0)
            : _a(a) {
            cout << "A(int a=0)" << endl;
        }
        A(const A& aa)
            : _a(aa._a) {
            cout << "A(const A& aa)" << endl;
        }
        A& operator=(const A& aa) {
            cout << "A& operator=(const A& aa)" << endl;
            if (this !=  &aa) {
                _a = aa._a;
            }

            return *this;
        }
        ~A() {
            cout << "~A()" << endl;
        }
    private:
        int _a;
 };
void f1(A aa) {

 }
A f2() {
    A aa;
    return aa;
 }
int main() {
    A aa1;
    f1(aa1);
    cout << endl;

    f2();
    cout << endl;

    f1(1);//构造函数构造出来的对象A,用来拷贝构造一个对象B,优化成,构造函数直接构造出来的对象B(直接用对象A)

    f1(A(2));//构造函数构造出来对象A,用来拷贝构造一个对象B,优化成,构造函数直接构造出来的对象B(直接用对象A)
    cout << endl;

    A aa2 = f2();//函数返回一个对象A,用来拷贝构造一个对象B,优化成,直接用对象A,A生命周期延长
    cout << endl;

    aa1 = f2();//函数返回一个对象A,赋值重载,无法优化
    cout << endl;

    return 0;
 }

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

启动盘重装ubuntu22系统

win+R msinfo32查看 插入制作好的u盘电脑开机 进入BIOS界面的方法有多种,以下是一些常见的方法: 进入BIOS界面的最常见按键有: Del键:大多数台式机通过在启动时按下Del键来进入BIOS。Esc键:在AMI BIOS和某些品牌电脑中,进入BIOS系统需要按“Esc”键,一般在开机画面…

简单实践 java spring cloud 负载均衡

1 概要 1.1 实现一个最简单的微服务。远程调用负载均衡&#xff0c;基本上完成了最核心的微服务框架。 远程调用&#xff1a;RestTemplate 注册中心&#xff1a;eureka 负载均衡&#xff1a;Ribbon 1.2 要点 1.2.1 依赖 1.2.1.1 主框架依赖 spring boot 依赖 <depe…

SpringMVC处理ajax请求之@ResponseBody注解,将后端数据响应到浏览器

上一篇文章讲到SpringMVC处理ajax请求用到的RequestBody注解SpringMVC处理ajax请求&#xff08;RequestBody注解&#xff09;&#xff0c;ajax向后端传递的数据格式详解-CSDN博客&#xff0c;这个注解帮我们解决了如何将客户端的数据通过json数据传递到服务器&#xff0c;简单说…

基于ARM的餐厅点餐系统的设计与实现

基于ARM的餐厅点餐系统的设计与实现 系统简介 本设计主要将 STM32F103ZET6 芯片作为无线订购系统主要控制芯片&#xff0c;分为顾客终端和厨师终端。顾客通过 LCD 显示屏浏览菜单并点击触摸屏选择自己所需菜单&#xff0c;并经过有线连接到 PC 端上位机&#xff0c;将订餐信息…

人工智能基础-Numpy矩阵运算-聚合操作

加、减、乘、除、整除 幂、取余、倒数、绝对值 三角函数 e的x次方、3的x次方、logx、log2为底、log10为底 矩阵运算 加、减、乘&#xff08;对应数相乘&#xff09;、矩阵相乘运算、转至 向量和矩阵的运算 加法 对应相加 改变维度后相加 乘法 矩阵的逆 聚合操作 …

单元测试实践

一、写在开始写单元测试前 1.1 背景 我们开发都知道单元测试的重要性&#xff0c;而且每个开发都有要写单元测试的意识单元测试和代码编写结构息息相关&#xff0c;业界常用专业名词TDD&#xff08;测试驱动开发&#xff09;&#xff0c;言外之意我们开始编写代码的时候就已经…

如何使用Cloudreve搭建私有云盘并发布公网访问无需购买域名服务器

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

自学Java的第54、55、56、57天

多线程 创建方式一 写法 注意&#xff1a; 创建方法二 写法 写法 简化&#xff1a; 创建方法三 写法 Thread的常用方法 写法 线程安全 用程序模拟 解决方法&#xff1a;线程同步 方法一 同步代码块 写法 方法二 同步方法 写法 方法三 Lock锁 写法 线程通信&#xff08;了解&…

壹[1],Xamarin开发环境配置

1&#xff0c;环境 VS2022 注&#xff1a; 1&#xff0c;本来计划使用AndroidStudio&#xff0c;但是也是一堆莫名的配置让人搞得很神伤&#xff0c;还是回归C#。 2&#xff0c;MAUI操作类似&#xff0c;但是很多错误解来解去&#xff0c;且调试起来很卡。 3&#xff0c;最…

企业计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密流程

网络是一把双刃剑&#xff0c;随着网络技术的不断发展与应用&#xff0c;企业的生产效率大大提升&#xff0c;企业的数据安全关乎着企业的发展&#xff0c;保护好企业的数据直观重要&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服…

Mistral-7B本地运行【Ollama】

Mistral AI 目前提供两种类型的大型语言模型访问方式&#xff1a; 提供按使用量付费访问最新模型的 API&#xff0c;开源模型可在 Apache 2.0 许可证下使用&#xff0c;可在 Hugging Face 上或直接从文档中获取。 在本指南中&#xff0c;我们概述了 Mistral 7B LLM 以及如何提…

多核CPU 缓存一致性(总线嗅探、MESI协议)

内存与CPU缓存的写一致性 CPU Cache 通常分为三级缓存&#xff1a;L1 Cache、L2 Cache、L3 Cache&#xff0c;级别越低的离 CPU 核心越近&#xff0c;访问速度也快&#xff0c;但是存储容量相对就会越小。其中&#xff0c;在多核心的 CPU 里&#xff0c;每个核心都有各自的 L1/…

孪生卷积神经网络(Siamese Convolutional Neural Network)的设计思路

孪生卷积神经网络&#xff08;Siamese Convolutional Neural Network&#xff09;是一种特殊类型的卷积神经网络&#xff0c;主要用于处理需要成对比较的数据&#xff0c;例如判断两个输入是否相似。 以下是孪生卷积神经网络的基本结构&#xff1a; 输入层&#xff1a;这一层…

python IDLE无法打开,提示错误#10051 向一个无法连接的网络尝试了一个套接字操作。

系统&#xff1a;Windows 10 软件&#xff1a;python 3.9.13 打开软件提示错误#10051 向一个无法连接的网络尝试了一个套接字操作。软件自动闪退。 解决方法&#xff1a; 可能是系统自动更新的问题或其他问题&#xff0c;导致防火墙阻止python连接本地端口。在防火墙上建立通…

win10使用IE访问某些特殊地址的极简办法(成功有效)

前言&#xff1a;看了好多其它办法&#xff0c;都没什么作用~ 1、打开win10默认的Edge浏览器的设置&#xff1a;点击右上角的三个点&#xff0c;然后里面有个设置选项 2、找到默认浏览器选项 3、添加你要访问的地址 5、在Edge中去访问你要访问的地址&#xff0c;就好了

非接触式激光测厚仪 单点/三点/多点在线测厚设备

关键字: 非接触式激光测厚仪, 板材厚度检测,激光测厚仪,单点测厚仪,三点测厚仪,多点测厚仪,扫描式激光测厚仪, 厚度是各类板材品质必检的尺寸之一 在实际测量中&#xff0c;板材厚度的测量&#xff0c;尤其是宽板中间位置的厚度尺寸测量&#xff0c;是一项较为困难的工作。为此…

揭秘二进制之谜:为何-128与+128的二进制表示相同,都是1000 0000?

8位有符号整数-128的二进制码是1000 0000&#xff0c;而128的二进制码也是1000 0000&#xff0c;你是不是觉得很奇怪&#xff1f; 下面就让我来解释一下。 从-128到127的跨越 8位二进制数能够表示2^8共256个不同的值&#xff0c;从0000 0000到1111 1111。在8位有符号整数的世…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…

带大家详细了解msvcr120.dll丢失的原因,msvcr120.dll丢失怎样修复的方法

在使用电脑和运行应用程序时&#xff0c;我们经常会遇到与动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件相关的错误。其中之一是 "msvcr120.dll 丢失" 的错误提示。今天我们就来详细的了解一下msvcr120.dll这个文件和分享msvcr120.dll丢失怎样修…

18- OpenCV:基于距离变换与分水岭的图像分割

目录 1、图像分割的含义 2、常见的图像分割方法 3、距离变换与分水岭介绍 4、相关API 5、代码演示 1、图像分割的含义 图像分割是指将一幅图像划分为若干个具有独立语义的区域或对象的过程。其目标是通过对图像进行像素级别的分类&#xff0c;将图像中不同的区域或对象分离…