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

学习笔记—C++—类和对象(三)

目录

类和对象

再探构造函数

类型转换

隐式类型转换

显式类型转换

C语言风格类型转换

C++风格类型转换

static_cast

dynamic_cast

const_cast

reinterpret_cast

static成员

友元

友元函数

友元类

友元成员函数

内部类

匿名对象

匿名对象的使用场景:

匿名对象的作用:

匿名对象的特点:

匿名对象的生命周期:

对象拷贝时的编译器优化


类和对象

再探构造函数

 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方

式,就是初始化列表,初始化列表的使用方式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成

员列表,每个"成员变量"后面跟⼀个放在括号中的初始值或表达式

每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方

引用成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表位置进行初始化,否则会编译报错

C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的

尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的⾃定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。

初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序初始化列表顺序保持⼀致

class Time
{
public :Time(int hour): _hour(hour){cout << "Time()" << endl;}
private:int _hour;
};
class Date
{
public :Date(int& x, int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day), _t(12), _ref(x), _n(1){// error C2512: “Time”: 没有合适的默认构造函数可⽤// error C2530 : “Date::_ref” : 必须初始化引⽤// error C2789 : “Date::_n” : 必须初始化常量限定类型的对象} void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:// 声明给缺省值 ->初始化列表int _year = 3; //在没有缺省值的情况下这个3就成缺省值的备胎一样代替缺省值int _month;int _day;Time _t;      // 没有默认构造int& _ref;    // 引⽤const int _n; // const
};
int main()
{int i = 0;Date d1(i);d1.Print();return 0;
}

三类必须在初始化列表初始化:引用成员变量,const成员变量,没有默认构造的类类型成员变量。

从下往上,先初始化_a2,但_a1还没有初始化呢,所以_a2就是随机值;_a1则使用的是被赋值的1。

类型转换

● C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。

● 构造函数前面加explicit就不再支持隐式类型转换。

● 类类型的对象之间也可以隐式转换,需要相应的构造函数支持。

隐式类型转换

隐式类型转换是由编译器自动完成的,通常发生在不同类型的变量之间进行操作时。C++ 会在合理的情况下自动转换类型,如将 int 转换为 double

int a = 10;
double b = 5.5;
double c = a + b;  // a 被自动转换为 double 类型

隐式转换虽然方便,但也可能会带来精度丢失或效率问题。例如 double 转换为 int 会丢失小数部分。

显式类型转换

C语言风格类型转换

C风格的类型转换是最简单的一种方式,但它不推荐在现代 C++ 中使用,因为它不够安全和灵活,无法区分具体的转换种类。

int a = 10;
double b = (double)a;  // C语言风格的显式类型转换
C++风格类型转换

显式类型转换通常通过强制转换(Type Casting)实现,程序员通过明确的语法告诉编译器进行类型转换。

C++ 提供了四种强制类型转换方法:

● static_cast

 dynamic_cast

 const_cast

● reinterpret_cast

static_cast

示例:

int a = 10;
double b = static_cast<double>(a);  // 将 int 类型转换为 double 类型

这是最常用的类型转换,适用于大多数基本类型之间的转换。它在编译期进行检查,不涉及运行时开销。

dynamic_cast

示例:

class Base {virtual void func() {}
};class Derived : public Base {void func() override {}
};Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);  // 基类转换为派生类

dynamic_cast 主要用于多态类型(带有虚函数的类)之间的转换,用于将基类指针或引用转换为派生类指针或引用,运行时检查转换是否成功,若失败,指针会返回 nullptr

const_cast

示例:

const int a = 10;
int* p = const_cast<int*>(&a);  // 去掉 const 属性
*p = 20;  // 这样做有风险,修改真正的常量可能导致未定义行为

const_cast 用于去掉或添加 const 属性。它主要用来修改常量变量,但请注意,不要试图通过它修改真正的常量

reinterpret_cast

示例:

int a = 42;
char* p = reinterpret_cast<char*>(&a);  // 将 int* 转换为 char*

这种转换最不安全,它将一种类型的指针或引用转换为另一种类型的指针或引用,主要用于底层操作,例如将 int 类型的指针转换为 char*

隐式和显式对比:

● 隐式转换:自动发生,不需要程序员的干预,但可能导致数据精度丢失或行为不明确。

● 显式转换:程序员手动进行转换,通常用于当隐式转换不能满足需求时。

static成员

用static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化

静态成员变量为所有类对象共享不属于某个具体的对象,不存在对象中,存放在静态区

static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针

静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针

 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。

突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。

静态成员也是类的成员,受public、protected、private 访问限定符的限制

静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。

求1+2+3+...+n_⽜客题霸_⽜客⽹

class Sum
{
public:Sum()//构造函数,每当创建了Sum类的对象就会自动进行调用例如{_ret+=_i;++_i;}static int GetRet(){return _ret;}
private:static int _i;static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;class Solution {
public:int Sum_Solution(int n){Sum arr[n];//创建一个有n个元素的数组return Sum::GetRet();//当这个数组被创建时,数组的每一个元素都会触发 Sum 类的构造函数,从而实现累加运算。}};

因为c是全局的,所以我们在main函数之前就可以进行初始化操作了。

对于析构函数的话,后定义的先进行析构操作,这里我们先析构ab,因为cd的声明周期是全局的,一定在main韩函数结束以后才会进行析构的操作。

局部的静态是会先进行析构的,全局后析构。

1. 静态成员变量的声明
在类内部声明静态成员变量时,使用 static 关键字。

示例:

class MyClass {
public:static int staticVar;  // 静态成员变量声明
};


在类 MyClass 中,我们声明了一个静态的整型变量 staticVar。注意,这里仅仅是声明。

2. 静态成员变量的初始化
静态成员变量需要在类外进行初始化,初始化时不使用 static 关键字,只需要指定其类型和类作用域。

示例:

class MyClass {
public:static int staticVar;  // 静态成员变量声明
};// 在类外部进行初始化
int MyClass::staticVar = 10;int main() {// 访问静态成员变量std::cout << "Static Variable: " << MyClass::staticVar << std::endl;// 修改静态成员变量MyClass::staticVar = 20;std::cout << "Updated Static Variable: " << MyClass::staticVar << std::endl;return 0;
}

3. 解释:
● class MyClass 中,我们声明了静态成员变量 staticVar

● 然后,在类的外部(在 main 函数之外的全局范围内),我们通过 MyClass::staticVar 进行静态成员变量的初始化。在这个过程中,我们指定它的初始值为 10。

之后,静态成员变量可以通过类名 MyClass::staticVar 进行访问和修改。

4. 静态成员变量的特点
● 静态成员变量只在类的作用域内声明一次,但会在类的所有对象中共享。

● 即使没有创建对象,也可以通过 类名::静态成员变量 进行访问。

● 它只需要在类外初始化一次,无论创建多少个对象,静态成员变量都不会被重新初始化。

● 静态成员变量的生命周期与程序的生命周期相同,直到程序结束时才会被销毁。

5. 静态成员变量的访问方式:
● 可以通过类名来访问静态成员变量:MyClass::staticVar

● 也可以通过类的对象来访问静态成员变量,但这并不是推荐的方式。

示例:

MyClass obj;
std::cout << "Static Variable via object: " << obj.staticVar << std::endl;  // 不推荐

6. 静态常量成员变量
对于常量静态成员变量(如 const static),可以在类内部进行初始化,但前提是它的类型必须是整型或枚举类型。

示例:

class MyClass {
public:static const int constVar = 100;  // 可以在类内部直接初始化
};

如果静态常量成员是非整数类型,则必须像普通静态成员一样,在类外进行初始化。

示例:

class MyClass {
public:static const double constDouble;
};// 类外初始化
const double MyClass::constDouble = 3.14;

静态成员变量在类内声明,在类外进行初始化。

静态成员变量属于类本身,而不是某个具体的对象。

静态成员变量可以通过类名访问,也可以通过对象访问(但不推荐)。

静态常量成员变量如果是整型或枚举类型,可以在类内直接初始化;否则,必须在类外进行初始化。

友元

● 友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的里面。

● 外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。

● 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。

⼀个函数可以是多个类的友元函数

友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。

友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元。

● 友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元

●  有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用

友元函数

 友元函数是一个不是类成员的函数,但它可以访问该类的所有私有成员和保护成员。要定义友元函数,可以在类定义中使用 friend 关键字声明。

class MyClass 
{// 声明友元函数friend void showValue(MyClass& obj);
private:int x;
public:MyClass(int val) : x(val) {}};// 定义友元函数
void showValue(MyClass& obj) {cout << "x = " << obj.x << endl;  // 访问私有成员 x
}int main() {MyClass obj(10);showValue(obj);  // 调用友元函数return 0;
}

showValue() 是 MyClass 类的友元函数,它能访问 MyClass 的私有成员 x

友元类

友元类允许一个类访问另一个类的所有私有和保护成员。在类定义中,可以使用 friend 关键字声明另一个类为其友元类。

class MyClass 
{// 声明 FriendClass 是 MyClass 的友元类friend class FriendClass;
private:int x;
public:MyClass(int val) : x(val) {}};class FriendClass {
public:void showValue(MyClass& obj) {cout << "x = " << obj.x << endl;  // 访问私有成员 x}
};int main() {MyClass obj(20);FriendClass fObj;fObj.showValue(obj);  // 通过友元类访问私有成员return 0;
}

FriendClass 是 MyClass 的友元类,因此FriendClass::showValue() 访问了 MyClass 中的私有成员 x

友元成员函数

你还可以将另一个类的某个成员函数声明为当前类的友元。这允许特定的成员函数访问当前类的私有成员,而不是整个类。

​class ClassB;  // 前向声明class ClassA 
{// 声明 ClassB 的某个成员函数是 ClassA 的友元friend void ClassB::show(ClassA& obj);
private:int x;
public:ClassA(int val) : x(val) {}};class ClassB {
public:void show(ClassA& obj) {cout << "x = " << obj.x << endl;  // 访问 ClassA 的私有成员 x}
};int main() {ClassA objA(30);ClassB objB;objB.show(objA);  // 通过 ClassB 的成员函数访问 ClassA 的私有成员return 0;
}​​

ClassB 的 show() 函数是 ClassA 的友元成员函数,因此它可以访问 ClassA 的私有成员 x

ClassB 本身不是 ClassA 的友元类,只有 show() 函数有权访问 ClassA 的私有成员。

友元函数:允许非成员函数访问类的私有成员。

友元类:允许另一个类访问当前类的所有成员。

友元成员函数:允许特定的成员函数访问类的私有成员。

内部类

●  如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。
●  内部类默认是外部类的友元类。
●  内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其
他地方都用不了。
class A
{
private:static int _k;int _h = 1;public:class B // B默认就是A的友元{public:void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}private:int _b;};
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;return 0;
}

内部类是外部的友元,只能通过外部才能调内部,内部类存储在静态区。

匿名对象

 用类型(实参) 定义出来的对象叫做匿名对象,相比之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象

匿名对象生命周期只在当前一行,⼀般临时定义⼀个对象当前用⼀下即可,就可以定义匿名对象。

匿名对象的使用场景:

  1. 函数的临时返回值: 当函数返回一个对象时,往往返回的是一个匿名对象。这个匿名对象可以被赋值给另一个变量,也可以作为临时对象直接使用。

  2. 临时对象的创建: 可以直接通过构造函数创建一个匿名对象,匿名对象只会在表达式的上下文中存活,使用完之后会立即销毁

匿名对象的作用:

           减少内存开销: 匿名对象通常用于那些只需要临时存在的对象场景。它们在创建之后立即使用,使用完后销毁,这样就不会占用多余的内存。

          简化代码: 匿名对象可以让代码更加简洁,因为不需要为临时对象定义名称,直接使用对象的构造函数创建并使用。

          优化性能: 现代C++编译器支持的返回值优化(RVO)和移动语义可以减少匿名对象的开销。尤其是通过移动构造函数,将匿名对象的资源“移动”到目标对象,而不是进行拷贝。

匿名对象的特点:

  1. 没有名称:匿名对象没有明确的变量名,它们直接在创建的地方使用。

  2. 短生命周期:通常,它们的生命周期很短,通常仅限于创建它们的上下文。

  3. 简化代码:匿名对象有助于避免为临时对象命名,减少不必要的代码。

class A
{public :A(int a = 0): _a(a){cout << "A(int a)" << endl;} ~A(){cout << "~A()" << endl;}
private:int _a;
};
class Solution {
public:int Sum_Solution(int n) {//...return n;}
};
void func(A aa=A(1))
{}int main()
{func();//有名对象A aa1(1);A aa2;//匿名对象A(1);A();//这种事有名对象调用函数的操作Solution s1;cout << s1.Sum_Solution(10) << endl;//下面是匿名对象调用函数cout << Solution().Sum_Solution(10) << endl;const A& r = A();return 0;
}

匿名对象的生命周期:

  1. 临时对象的创建:当表达式或函数需要时,匿名对象会立即创建。
  2. 临时对象的销毁:一旦表达式结束,匿名对象会被立即销毁。析构函数会自动被调用。

注意事项:匿名对象虽然能简化代码,但也可能让代码变得难以调试或维护,因为没有明确的对象引用。如果多个地方需要使用相同的对象,建议使用具名对象。

匿名对象 是一种不具名的临时对象,通常在函数返回值、参数传递和临时计算时使用。

生命周期非常短,它们在表达式结束后立即销毁,析构函数会自动调用。

减少了冗余对象的创建,有助于简化代码并优化性能。

对象拷贝时的编译器优化

● 现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷贝。

● 如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"的编译器还会进行跨行跨表达式的合并优化。

class A
{public :A(int a = 0): _a1(a){cout << "A(int a)" << endl;} A(const A& aa):_a1(aa._a1){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a1 = aa._a1;} return* this;} ~A(){cout << "~A()" << endl;}
private: int _a1 = 1;
};
void f1(A aa)
{}
int main()
{//优化A aa1=1;// 传值传参A aa1;f1(aa1);cout << endl;// 隐式类型,连续构造+拷⻉构造->优化为直接构造f1(1);// ⼀个表达式中,连续构造+拷⻉构造->优化为⼀个构造f1(A(2));cout << endl; return 0;
}

1. 返回值优化
当函数返回一个对象时,编译器可以直接在调用方的内存空间中构造返回的对象,而不是先在函数内部构造,然后再拷贝到调用方。这种优化可以避免一次不必要的对象拷贝。

示例:  

MyClass createObject() {return MyClass();
}

在没有RVO时,MyClass() 会先在函数内部创建,然后拷贝到调用方。开启RVO后,MyClass 可以直接在调用方的内存空间中构造。

2.移动语义
在C++11及之后的版本中,移动语义是一种用于减少不必要拷贝的优化。当对象被移动时,编译器会通过“偷取”资源的方式来避免深拷贝。

移动构造函数和移动赋值运算符允许编译器从源对象中“移动”资源,而不是复制它们。这在临时对象或对象需要从另一个作用域转移时特别有用。

示例:

MyClass obj1;
MyClass obj2 = std::move(obj1); // 通过移动语义“偷取”资源,而不是拷贝

3. 拷贝省略
C++17引入了强制的拷贝省略规则,意味着在某些情况下,即使没有定义移动构造函数或移动赋值运算符,编译器也会跳过拷贝操作,直接构造目标对象。

示例:
 

MyClass createObject() {MyClass obj;return obj; // 编译器可以省略拷贝或移动
}

4. 内联优化(Inline Expansion)
对于小的、频繁调用的函数,编译器可能会选择内联展开函数代码。这样不仅减少了函数调用的开销,同时还可能使编译器在内联的上下文中进行更多的对象优化。

示例:

inline MyClass createObject() {return MyClass();
}

5. 对象合并与内存重用
对象合并是一种编译器优化,它尝试将多个对象的生命周期进行分析,如果它们不会同时存在于内存中,编译器可以将它们分配在同一块内存空间中,从而减少内存占用。

6. 懒惰拷贝
也称为写时拷贝(Copy on Write, COW)。当多个对象引用同一资源时,编译器会延迟执行真正的拷贝,直到有一个对象尝试修改该资源时才进行拷贝。这避免了不必要的深拷贝。

7. 循环展开与向量化优化
在对象拷贝的循环中,编译器可能会进行循环展开向量化优化,将循环中的多个对象拷贝操作合并或并行化,以提高性能。

这些优化大部分依赖于编译器本身的优化级别设置(如-O2, -O3),程序员也可以通过编写合理的代码和使用现代C++特性(如移动语义)来帮助编译器进行更好的优化。

相关文章:

学习笔记—C++—类和对象(三)

目录 类和对象 再探构造函数 类型转换 隐式类型转换 显式类型转换 C语言风格类型转换 C风格类型转换 static_cast dynamic_cast const_cast reinterpret_cast static成员 友元 友元函数 友元类 友元成员函数 内部类 匿名对象 匿名对象的使用场景&#xff1a;…...

句句翻译。

对这些单词整理&#xff0c;格式为&#xff1a;“overall /əʊvərɔːl/ adj.全面的,综合的,总体的adv.全部,总 计,一般来说,大致上,总体上n.外套,罩衣,工装连衣裤,工装 服 ” 4,4 A review published in January in Experimental Dermatology found that ceramide made sk…...

LeetCode 2999.统计强大整数的数目:上下界数位DP

【LetMeFly】2999.统计强大整数的数目&#xff1a;上下界数位DP 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-powerful-integers/ 给你三个整数 start &#xff0c;finish 和 limit 。同时给你一个下标从 0 开始的字符串 s &#xff0c;表示一…...

具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航

作者&#xff1a;Mohamed Elnoor 1 ^{1} 1, Kasun Weerakoon 1 ^{1} 1, Gershom Seneviratne 1 ^{1} 1, Jing Liang 2 ^{2} 2, Vignesh Rajagopal 3 ^{3} 3, and Dinesh Manocha 1 , 2 ^{1,2} 1,2单位&#xff1a; 1 ^{1} 1马里兰大学帕克分校电气与计算机工程系&#xff0c; 2…...

FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)

裸机程序设计模式 裸机程序的设计模式可以分为&#xff1a;轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题&#xff1a;假设有A、B两个都很耗时的函数&#xff0c;无法降低它们相互之间的影响。第4种方法可以解决这个问题&#xff0c;但是实践起来有难…...

算法思想之位运算(二)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之位运算(二) 发布时间&#xff1a;2025.4.13 隶属专栏&#xff1a;算法 目录 滑动窗口算法介绍六大基础位运算符常用模板总结 例题判定字符是否唯一题目链接题目描述算法思路代码实现 汉明距离题目链接题目…...

软考笔记day04

寻址方式 CISC RISC 流水线技术 存储系统 1、层次化存储系统 2、Cache 3、主存编址计算 输入输出技术 I/O 总线...

本地电脑如何连接windows云服务器

进行远程连接需要几个数据&#xff1a;用户名、密码、公网IP 打开本地cmd&#xff0c;输入命令mstsc打开远程连接面板&#xff0c; 在计算机输入框中输入云服务器的IP地址 点击“选项”展开&#xff0c;点击“本地资源”&#xff0c;然后点击“详细信息” 用户名通常为admin…...

Linux内核常见的调度策略

在 Linux 内核中&#xff0c;调度策略决定了任务如何被分配 CPU 时间以及任务之间的优先级关系。以下是五种常见的调度策略&#xff1a;STOP、DL&#xff08;Deadline&#xff09;、RT&#xff08;Real-Time&#xff09;、CFS&#xff08;Completely Fair Scheduler&#xff09…...

【Linux】进程优先级、进程切换、进程调度

Linux 1.进程优先级1.基本概念2.查看进程1.UID2.PRI、NI3.修改优先级&#xff08;PRI&#xff09; 3.竞争、独立、并行、并发 2.进程切换3.进程调度1.活动队列2.过期队列3.active、expired指针 1.进程优先级 1.基本概念 优先级&#xff1a;进程得到 CPU 资源分配的先后顺序。优…...

HCIP第十二天

LSA --- 链路状态通告 链路状态类型&#xff0c;链路状态ID&#xff0c;通告路由器 --- LSA的三元组 --- 可以唯一的标识出一条LSA Type --- OSPFv2中&#xff0c;常见的需要掌握LSA有6种 LS ID --- LSA的名字 --- 因为每一种LSA LS ID的生成方式都不相同&#xff0c;所以&am…...

Magnet Pro Macbook窗口分屏管理软件【提高效率工具】

Magnet Pro Macbook窗口分屏管理软件【提高效率工具】 一、介绍 Magnet Pro for Mac&#xff0c;是一款功能强大的窗口分屏管理软件&#xff0c;具有多种布局模式、窗口布局功能和其他工具&#xff0c;可以帮助您高效地进行多任务处理和管理工作。 拖动窗口到边缘&#xff0c…...

控制单元(Control Unit, CU)

一、控制单元的定义与核心作用 控制单元 是 CPU 的核心部件之一&#xff0c;负责 解析指令、生成控制信号 并 协调各硬件部件 的工作时序&#xff0c;确保指令按预定流程正确执行。 核心定位&#xff1a;计算机系统的“指挥中心”&#xff0c;通过控制总线与运算器、存储器、…...

JavaWeb 课堂笔记 —— 10 MySQL DML + DQL

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…...

基于 LSTM 的多特征序列预测-SHAP可视化!

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…...

【C++】哈希扩展海量数据处理

目录 位图 位图面试题 C库中的位图bitset 位图优缺点 位图相关题目 布隆过滤器 布隆过滤器的介绍 布隆过滤器的应用 海量数据处理 位图 位图面试题 1.给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个整数是否在这40亿…...

考研数据结构精讲:数组与特殊矩阵的压缩存储技巧(包含真题及解析)

考研数据结构精讲&#xff1a;数组与特殊矩阵的压缩存储技巧 一、数组基础概念 1.1 数组的定义 数组是由相同数据类型的元素构成的有限序列&#xff0c;具有以下核心特性&#xff1a; 维度特性&#xff1a;支持一维到多维结构&#xff08;常见二维数组&#xff09;随机访问…...

【Android】ContentResolver的使用

在 Android 中&#xff0c;ContentResolver 是一个非常重要的类&#xff0c;它提供了与 ContentProvider 进行交互的方法。ContentProvider 是用于在不同应用程序之间共享数据的标准接口&#xff0c;而 ContentResolver 则是从客户端&#xff08;如 Activity 或 Service&#x…...

Python 的 collections 模块

1. deque (双端队列) 定义 deque&#xff08;读作 “deck”&#xff0c;即双端队列&#xff09;是一个支持从两端高效添加和删除元素的数据结构。相比列表&#xff08;list&#xff09;在头部操作的 O(n) 时间复杂度&#xff0c;deque 的两端操作都是 O(1)。 用途 队列和栈…...

浏览器发起调用到服务器的全过程解析

在 Web 应用的交互过程中&#xff0c;从用户在浏览器输入 URL 发起请求&#xff0c;到最终获取服务器返回的内容&#xff0c;背后涉及多个复杂而有序的步骤。理解这一过程&#xff0c;对于深入掌握 Web 开发、优化应用性能以及排查网络问题都具有重要意义。下面将详细阐述浏览器…...

塑料瓶识别分割数据集labelme格式976张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;976 标注数量(json文件个数)&#xff1a;976 标注类别数&#xff1a;1 标注类别名称:["Trash plastic"] 每个类别标注的框数…...

RuoYi-Vue升级为https访问-后端安装SSL证书(单台Linux服务器部署)

一、前言 当Nginx已经作为反向代理并成功配置了SSL证书时,前端客户端与Nginx的通信已经是加密的。但Nginx和后端服务之间的连接可能仍然存在明文传输的风险。 如果Nginx和后端服务位于同一台物理机器或者通过安全的内部网络(如私有VLAN或防火墙保护的内网)进行通信,则可以…...

【学习笔记】文件上传漏洞--中间件解析漏洞、编辑器安全

目录 一、IIS 二、Apache HTTP Server 三、Apache HTTPD 未知后缀解析漏洞 四、Apache HTTPD 换行解析漏洞 五、黑、白名单 六、nginx解析漏洞 七、编辑器漏洞 一、IIS 文件夹 正常&#xff1a;image/qq.jpg 执行&#xff1a;image.asp/qq.jpg qq.jpg就会被当做asp解…...

【论文阅读】UniAD: Planning-oriented Autonomous Driving

一、Introduction 传统的无人驾驶采用了区分子模块的设计&#xff0c;即将无人驾驶拆分为感知规划控制三个模块&#xff0c;这虽然能够让无人驾驶以一个很清晰的结构实现&#xff0c;但是感知的结果在传达到规划部分的时候&#xff0c;会导致部分信息丢失&#xff0c;这势必会…...

【第16届蓝桥杯C++C组】--- 数位倍数

Hello呀&#xff0c;小伙伴们&#xff0c;第16届蓝桥杯也完美结束了&#xff0c;无论大家考的如何&#xff0c;都要放平心态&#xff0c;今年我刚上大一&#xff0c;也第一次参加蓝桥杯&#xff0c;刷的算法题也只有200来道&#xff0c;但是还是考的不咋滴&#xff0c;但是拿不…...

【腾讯云智】20250329笔试算法题

文章目录 第一题1. 题目描述2. 思路解析3. AC代码 第二题1. 题目描述2. 思路解析3. AC代码 第三题1. 题目描述2. 思路解析3. AC代码 第一题 1. 题目描述 题目链接&#xff1a;牛牛的水果店 2. 思路解析 这题比较简单&#xff0c;按数学思维把题目的意思翻译过来就是给你一…...

【2025最新】windows本地部署LightRAG,完成neo4j知识图谱保存

之前在服务器部署neo4j失败&#xff0c;无奈只能在本地部署&#xff0c;导致后期所有使用的知识图谱数据都存在本地&#xff0c;这里为了节省时间&#xff0c;先在本地安装LigthRAG完成整个实验流程&#xff0c;后续在学习各种服务器部署和端口调用。从基础和简单的部分先做起来…...

思考力提升的黄金标准:广度、深度与速度的深度剖析

文章目录 引言一、广度的拓展&#xff1a;构建多元知识网络1.1 定义与重要性1.2 IT技术实例与提升策略小结&#xff1a;构建多元知识网络&#xff0c;提升IT领域思考力广度 二、深度的挖掘&#xff1a;追求知识的精髓2.1 定义与重要性2.2 IT技术实例与提升策略小结&#xff1a;…...

7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant

7个向量数据库对比&#xff1a;Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 本文简要总结了当今市场上正在积极开发的7个向量数据库&#xff0c;Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 的详细比较。 我们已经接近在搜索引擎体验的基础层面上涉…...

计算机组成原理笔记(十五)——3.5指令系统的发展

不同类型的计算机有各具特色的指令系统&#xff0c;由于计算机的性能、机器结构和使用环境不同&#xff0c;指令系统的差异也是很大的。 3.5.1 x86架构的扩展指令集 x86架构的扩展指令集是为了增强处理器在多媒体、三维图形、并行计算等领域的性能而设计的。这些扩展指令集通…...

Rust 中的Relaxed 内存指令重排演示:X=0 Y=0 是怎么出现的?

&#x1f525; Rust 中的内存重排演示&#xff1a;X0 && Y0 是怎么出现的&#xff1f; 在并发编程中&#xff0c;我们经常会听说“内存重排&#xff08;Memory Reordering&#xff09;”这个术语&#xff0c;但它似乎总是只出现在理论或者别人口中的幻觉里。本文将通过…...

vp 2023 icpc 合肥 解题补题记录 [F E J G]

gym 链接: https://codeforces.com/gym/104857 F. Colorful Balloons 血签, 用 map 存一下每个颜色气球出现的次数, 找出出现次数大于一半的颜色. #include<bits/stdc.h> using namespace std;#define int long long #define endl \nsigned main() {int n;cin >> …...

学习SqlSugar的跨库查询基本用法

使用SqlSugar操作数据库通常都是单库操作&#xff0c;跨库查询的情况要么是单个系统数据不完整&#xff0c;需要其它系统的关联业务数据支撑&#xff0c;要么就是需要整合汇总多个系统的数据进行数据数据分析、处理、展示。遇到上述情况&#xff0c;可以要求另外的系统提供查询…...

智慧工厂可视化系统,赋能工业生产智能化升级

借助图扑软件 HT 搭建智慧工厂可视化系统。利用先进 3D 建模&#xff0c;对工厂布局、设备运行、生产流程进行逼真复刻。实时展示设备状态、生产进度、质量检测数据等&#xff0c;助力管理者精准洞察生产&#xff0c;高效决策&#xff0c;推动工厂智能化转型。...

案例驱动的 IT 团队管理:创新与突破之路: 第四章 危机应对:从风险预见到创新破局-4.1.2债务评估模型与优先级排序

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 4.1.2 技术债务评估模型与优先级排序&#xff1a;构建智能决策体系一、技术债务的"冰山效应"与量化困境二、三维评估模型&#xff1a;穿透债务迷雾的探照灯2.1 评…...

nfs共享目录主配置文件权限参数

/etc/exports 文件默认为空文件&#xff0c;需要输入nfs共享命令 格式&#xff1a;共享目录的路径 允许访问的NFS客户端(共享权限参数) #编辑共享目录配置文件&#xff08;即/etc/exports&#xff09; [rootserver ~]# mkdir /nfs_share &#xff08;创建共享的目录&#xf…...

C++ 编程指南35 - 为保持ABI稳定,应避免模板接口

一&#xff1a;概述 模板在 C 中是编译期展开的&#xff0c;不同模板参数会生成不同的代码&#xff0c;这使得模板类/函数天然不具备 ABI 稳定性。为了保持ABI稳定&#xff0c;接口不要直接用模板&#xff0c;先用普通类打个底&#xff0c;模板只是“外壳”&#xff0c;这样 AB…...

探索 MCP 和 A2A 协议: 本质上新协议都基于 HTTP的

以下是以 CSDN 博客的形式记录你对 MCP 协议和 A2A 协议数据传递的理解&#xff0c;重点探讨了它们为何基于 HTTP 协议、HTTP 的优势&#xff0c;以及数据传输的本质。文章面向技术社区&#xff0c;结构清晰&#xff0c;适合分享。 探索 MCP 和 A2A 协议&#xff1a;为何新协议…...

Linux网络http与https

应用层协议HTTP 提示 因为现在大多数都是https&#xff0c;所以就用https来介绍http&#xff0c;https比http多了一个加密功能&#xff0c;不影响介绍http。 什么是http 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的…...

C++ 算法(2):STL list 完全解析,从入门到高效使用

1. list概述 std::list是C标准模板库(STL)中的一个双向链表容器。与vector和deque不同&#xff0c;list不支持随机访问&#xff0c;但它在任何位置插入和删除元素都非常高效&#xff0c;时间复杂度为O(1)。 2. list的基本特性 双向链表结构&#xff1a;每个元素都包含指向前驱…...

【Linux实践系列】:匿名管道收尾+完善shell外壳程序

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生总会有自己能力所不及的范围&#xff0c;但是如果你在你能力所及的范围尽了全部的努力&#xff0c;那你还有什么遗…...

Linux基本指令2

1.head 查看文件的前面内容 head 路径 &#xff1a;查看路径开头部分内容&#xff0c;如下图&#xff1a;head /var/log/messages查看/var/log/messages这个日志中前面内容 head -数字 路径 &#xff1a;查看路径开头指定数字行部分内容&#xff0c;如下图&#xff1a;he…...

Tkinter使用Canvas绘制图形

在Tkinter中,Canvas是一个非常强大的控件,用于绘制图形、显示图片和实现自定义图形界面。通过Canvas,您可以绘制各种形状、线条、文本等,并且能够进行灵活的动画和交互。掌握Canvas的使用将使您能够创建丰富的图形界面。 8.1 创建Canvas控件 Canvas控件是一个区域,用于绘…...

CF985G Team Players

我敢赌&#xff0c;就算你知道怎么做&#xff0c;也必然得调试半天才能 AC。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 图片来自洛谷。 [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 显然不可能正面计算。所以…...

ngx_conf_read_token - events

file_size ngx_file_size(&cf->conf_file->file.info); 获取 配置文件的大小 此时 file_size364 for ( ;; ) {if (b->pos > b->last) { 此时 b->pos 0x5cd4701487e4 b->last 0x5cd47014893c b->start0x5cd4701487d0 条件不成立 ch *b->pos;…...

L2范数与权重衰退

权重衰退 定义损失函数 $ \ell(\mathbf{w}, b) $ 来衡量模型的预测值与真实值的差距 使用L2范数作为硬性限制 通过限制参数值的选择范围来控制模型容量 min ⁡ ℓ ( w , b ) s u b j e c t t o ∥ w ∥ 2 ≤ θ \min \ell(\mathbf{w}, b) \quad \\ subject \ to \|\mathbf{w…...

计算机组成原理笔记(十四)——3.4指令类型

一台计算机的指令系统可以有上百条指令&#xff0c;这些指令按其功能可以分成几种类型&#xff0c;下面分别介绍。 3.4.1数据传送类指令 一、核心概念与功能定位 数据传送类指令是计算机指令系统中最基础的指令类型&#xff0c;负责在 寄存器、主存、I/O设备 之间高效复制数…...

GM DC Monitor v2.0 数据中心监控预警平台-CMDB使用教程(第九篇)

SNMP配置管理功能使用手册 本模块主要用于导入设备厂家的mib库文件&#xff0c;也可以手工创建对应的oid信息&#xff0c;用以实现设备的被动监控功能。 另&#xff1a;系统部署完毕后&#xff0c;已经集成了个别厂家的MIB库数据。 设计思路及使用教程 设计思路&#xff1a;通…...

try-with-resources 详解

try-with-resources 详解 一、基本概念 try-with-resources 是 Java 7 引入的语法结构&#xff0c;用于自动管理资源&#xff08;如文件流、数据库连接等需要关闭的对象&#xff09;。 核心特点 自动资源释放&#xff1a;无需手动调用 close() 简洁代码&#xff1a;减少 tr…...

第二十四:查看当前 端口号是否被占用

查看当前 端口号是否被占用&#xff1a; mac 情况下&#xff1a; lsof -i :端口号 netstat -an | grep 端口号 系统将显示监听该端口的进程信息&#xff0c;包括进程名称、进程ID、用户和协议等。如果需要更多信息&#xff0c;可以添加-P和-n参数&#xff0c;例如&#xf…...