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

【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解

文章目录

前言 

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助!别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

 4. 友元

在C++中,友元(friend)提供了一种突破类的访问限定符的机制,使得外部函数或其他类可以访问类的私有(private)受保护的成员(protected)。友元可以是友元函数友元类,而这种友元关系是在类定义中通过关键字 friend 显式声明的。

 4.1 友元涉及的基本概念


<一> 友元函数:友元函数可以访问类的私有和受保护成员,但它并不是类的成员函数。
<二>友元类:某个类的所有成员函数都可以是另一个类的友元,允许访问该类的私有和受保护成员。
<三>单向关系:友元关系是单向的,如果A类是B类的友元,B类的成员函数可以访问A类的私有成员,但A类不能访问B类的私有成员,除非B类也显式声明A类为友元。
<四>友元的局限性:虽然友元提供了便利,但它打破了类的封装性,增加了类之间的耦合,因此不宜滥用。

4.2 友元函数

友元函数是一个外部函数,但通过友元声明,它可以访问类的私有和受保护的成员。友元函数不属于类的成员函数,它可以在类的任意地方声明,而不受访问限定符(publicprivateprotected)的限制。

示例:友元函数访问两个类的私有成员 

#include<iostream>
using namespace std;// 前置声明,避免类A的友元函数不识别类B
class B;class A {// 友元声明,允许函数 func 访问A类的私有成员friend void func(const A& aa, const B& bb);private:int _a1 = 1;int _a2 = 2;
};class B {// 友元声明,允许函数 func 访问B类的私有成员friend void func(const A& aa, const B& bb);private:int _b1 = 3;int _b2 = 4;
};// 友元函数定义,能够访问A和B类的私有成员
void func(const A& aa, const B& bb) {cout << "A::_a1: " << aa._a1 << endl;  // 访问A类的私有成员cout << "B::_b1: " << bb._b1 << endl;  // 访问B类的私有成员
}int main() {A aa;B bb;func(aa, bb);  // 调用友元函数,访问A和B类的私有成员return 0;
}

解释

  • 函数 func 被声明为 A 和 B 类的友元,因此它可以访问 A 类和 B 类的私有成员变量 _a1 和 _b1
  • 虽然 func 是一个独立于类的外部函数,但通过友元声明,它获得了访问类的私有数据的权限。

4.3 友元类

友元类允许一个类的所有成员函数访问另一个类的私有和受保护成员。友元类的成员函数并不需要逐一声明为友元,只要类被声明为友元,所有的成员函数都能访问另一个类的私有和受保护成员。

示例:友元类的使用 

#include<iostream>
using namespace std;class A {// 友元类B声明,允许B类的所有成员函数访问A类的私有成员friend class B;private:int _a1 = 1;int _a2 = 2;
};class B {
public:// 可以访问A类的私有成员void func1(const A& aa) {cout << "A::_a1: " << aa._a1 << endl;  // 访问A类的私有成员cout << "B::_b1: " << _b1 << endl;     // 访问B类的私有成员}void func2(const A& aa) {cout << "A::_a2: " << aa._a2 << endl;  // 访问A类的私有成员cout << "B::_b2: " << _b2 << endl;     // 访问B类的私有成员}private:int _b1 = 3;int _b2 = 4;
};int main() {A aa;B bb;bb.func1(aa);  // 通过B类的成员函数访问A类的私有成员bb.func2(aa);  // 通过B类的成员函数访问A类的私有成员return 0;
}

解释

  • B 类被声明为 A 类的友元类,因此 B 类的所有成员函数都可以访问 A 类的私有成员 _a1 和 _a2
  • 通过友元类声明,不需要逐个将 B 类的成员函数声明为 A 类的友元,只要 B 类是 A 类的友元,B 类的所有成员函数都可以访问 A 类的私有数据。

4.4 友元的特性与限制

  • 单向关系:友元关系是单向的,如果 A 是 B 的友元,那么 B 类的成员可以访问 A 类的私有成员,但 A 类不能访问 B 类的私有成员,除非 B 类也将 A 类声明为友元。

示例:单向友元关系

class A;class B {friend class A;  // B 声明 A 为友元
private:int _b1 = 1;
};class A {
public:void accessB(B& bb) {// A 可以访问 B 的私有成员cout << "B::_b1: " << bb._b1 << endl;}
};int main() {A aa;B bb;aa.accessB(bb);  // A 类访问 B 的私有成员return 0;
}
  • 不具有传递性:友元关系不具有传递性。如果 A 是 B 的友元,B 是 C 的友元,A 不能访问 C 类的私有成员。

  • 友元增加耦合性:虽然友元机制提供了访问类私有成员的便利,但过度使用友元会导致类与类之间的耦合增加,破坏了类的封装性。因此,友元不宜滥用,应该谨慎使用。

4.5 友元函数与类的实际应用

友元在某些情况下能提供方便,比如当需要两个类之间进行紧密合作时,使用友元可以简化代码,减少冗长的接口设计。

#include<iostream>
using namespace std;class Account;class Transaction {
public:void deposit(Account& account, double amount);void withdraw(Account& account, double amount);
};class Account {friend class Transaction;  // 声明 Transaction 类为友元类
public:Account(double balance) : _balance(balance) {}void showBalance() const {cout << "Balance: " << _balance << endl;}private:double _balance;
};void Transaction::deposit(Account& account, double amount) {account._balance += amount;  // 直接访问 Account 类的私有成员
}void Transaction::withdraw(Account& account, double amount) {if (amount <= account._balance) {account._balance -= amount;} else {cout << "Insufficient balance" << endl;}
}int main() {Account myAccount(1000.0);Transaction trans;trans.deposit(myAccount, 500.0);  // 存款myAccount.showBalance();          // 输出:1500trans.withdraw(myAccount, 200.0); // 取款myAccount.showBalance();          // 输出:1300return 0;
}

解释:

Transaction 类被声明为 Account 类的友元类,因此 Transaction 类的成员函数 deposit 和 withdraw 可以直接访问 Account 类的私有成员 _balance。

这种情况下,友元机制简化了类与类之间的合作,不必通过公共接口访问私有数据,减少了不必要的代码冗。

总结


友元机制在C++中提供了一种打破类封装的方式,允许外部函数或类访问类的私有和受保护成员。它通过friend关键字来声明友元函数或友元类,使得类之间的合作更加简便。
友元函数和友元类都有其特定的用途,友元函数可以访问多个类的私有成员,而友元类则使得另一个类的所有成员函数都可以访问当前类的私有数据。
友元关系是单向的,不具有传递性,过度使用友元会破坏类的封装性和增加类的耦合性,应该谨慎使用。

5. 内部类

内部类(Nested Class)是指一个类定义在另一个类的内部。在C++中,内部类和外部类是独立的类,尽管它们之间有一定的联系,但内部类不属于外部类的对象,它有自己的内存布局和独立性。使用内部类通常是为了封装简化类之间的关联

5.1 内部类的基本概念


1.独立性:尽管内部类是定义在外部类的内部,但它是一个独立的类。外部类的对象并不包含内部类的对象。也就是说,创建外部类的对象时,并不会自动创建内部类的对象,内部类需要单独实例化。
2.友元关系:内部类默认是外部类的友元类,这意味着内部类可以访问外部类的私有成员。
3.封装:使用内部类可以将一些只在外部类内部使用的逻辑封装起来,使代码更加紧凑和可控。内部类可以定义在 private 或 protected 访问限定符下,限制其他类对其的访问。

5.2 内部类的使用示例

#include<iostream>
using namespace std;class A {
private:static int _k;  // 外部类的静态成员int _h = 1;     // 外部类的非静态成员public:// 定义内部类 Bclass B {public:// 内部类方法可以访问外部类的私有成员,因为 B 是 A 的友元类void foo(const A& a) {cout << "A::_k = " << _k << endl;   // 访问外部类的静态成员cout << "A::_h = " << a._h << endl; // 访问外部类的非静态成员}};
};// 初始化外部类的静态成员
int A::_k = 1;int main() {cout << "Size of A: " << sizeof(A) << endl;  // 输出 A 类的大小A::B b;  // 创建内部类 B 的对象A aa;    // 创建外部类 A 的对象b.foo(aa);  // 使用内部类对象调用其方法,访问外部类的私有成员return 0;
}

解释:

内部类 B 被定义在外部类 A 的 public 区域中,但它依然是 A 的友元类,可以访问 A 类的私有成员变量 _k 和 _h。
创建了 A::B b 来实例化内部类 B,然后通过内部类的成员函数 foo 访问外部类对象的私有成员。
sizeof(A) 表示 A 类的大小,由于 A 只有一个整数成员 _h,因此其大小为4字节。

5.3 封装与访问权限

内部类作为外部类的一部分,可以被放置在 private 或 protected 访问区域中,这样可以控制内部类的可见性。

示例:将内部类放在 private 区域 

#include<iostream>
using namespace std;class Outer {
private:class Inner {  // 内部类定义在 private 区域public:void display() {cout << "Inner class method called." << endl;}};public:void createInner() {Inner in;   // 外部类的方法中可以创建内部类的对象in.display();}
};int main() {Outer outer;outer.createInner();  // 通过外部类的方法调用内部类的方法// Outer::Inner in;  // 错误!内部类在 private 区域,外部无法访问return 0;
}

解释

  • 在这个例子中,内部类 Inner 定义在 Outer 类的 private 区域,外部类的方法 createInner() 可以创建 Inner 类的对象并调用其方法。
  • 尝试在外部直接访问 Inner 类会导致编译错误,因为它是 private 的。

5.4 内部类的封装与应用场景

使用内部类的一个常见场景是当两个类紧密相关时,可以将一个类封装到另一个类中。这样做的目的是让外部类管理内部类的访问,使得内部类只为外部类所用。

场景:内部类作为外部类的专属工具类

#include<iostream>
using namespace std;class Manager {
private:class Task {public:void performTask() {cout << "Performing task." << endl;}};public:void assignTask() {Task t;  // 外部类方法可以使用内部类t.performTask();}
};int main() {Manager mgr;mgr.assignTask();  // 调用外部类的方法,执行内部类中的任务逻辑return 0;
}

解释:

这里,Task 类被封装在 Manager 类的 private 区域,表示 Task 只为 Manager 类服务,外部无法直接访问它。
这是一种封装技术,用于使 Task 类专属于 Manager 类,外部无法创建 Task 对象,只能通过 Manager 类的方法来间接使用它。


5.5 内部类的友元关系

内部类默认是外部类的友元类,这意味着内部类可以访问外部类的私有和受保护成员。这种设计允许内部类和外部类之间进行紧密的合作,使得内部类可以像外部类的成员函数一样访问其内部数据。

示例:内部类访问外部类的私有成员 

#include<iostream>
using namespace std;class Container {
private:int _data = 100;public:// 定义内部类class Helper {public:void showData(const Container& c) {cout << "Container::_data = " << c._data << endl;  // 访问外部类的私有成员}};
};int main() {Container c;Container::Helper h;  // 创建内部类对象h.showData(c);  // 调用内部类的方法,访问外部类的私有成员return 0;
}

解释

  • Helper 类作为 Container 的内部类,默认是 Container 的友元,因此它可以访问 Container 类的私有成员 _data
  • 通过内部类的对象 h,可以调用 showData 方法来访问外部类 Container 的私有数据。

5.6 应用:求 1 + 2 + 3 + … + n

#include<iostream>
using namespace std;class Solution {// 内部类 Sum,用于进行累加操作class Sum {public:Sum() {_ret += _i;  // 每创建一个对象,累加一次当前的 _i++_i;        // 自增 i}};static int _i;    // 用于计数的静态变量static int _ret;  // 用于存储结果的静态变量public:int Sum_Solution(int n) {Sum arr[n];  // 创建 n 个 Sum 对象,触发累加逻辑return _ret; // 返回累加的结果}
};// 初始化静态变量
int Solution::_i = 1;
int Solution::_ret = 0;int main() {Solution sol;cout << "Sum of 1 to 5: " << sol.Sum_Solution(5) << endl;  // 1 + 2 + 3 + 4 + 5 = 15return 0;
}

解释

  • 内部类 Sum 在创建对象时会自动进行累加操作,创建 n 个 Sum 对象等价于对 1 到 n 进行

累加。

  • 静态变量 _i 用于记录当前的计数,_ret 用于存储累加的结果。

总结

内部类是一种封装机制,允许将类定义在另一个类的内部,从而限制内部类的可见性或封装内部逻辑。内部类与外部类独立,但它默认可以访问外部类的私有成员。
内部类的主要优势是封装性和紧密耦合。当一个类主要是为了另一个类服务时,将其设计为内部类可以减少外部依赖和接口冗余。
内部类可以用于实现复杂的逻辑封装、类间的紧密合作、计算封装等多个场景,但应谨慎使用,避免过度增加类的复杂性。

 6. 匿名对象

匿名对象是C++中的一种特殊对象,和普通的有名对象不同,匿名对象没有名字,仅在表达式中被使用,生命周期非常短暂。它的生命周期只限于当前语句,当语句执行结束后,匿名对象就会自动被销毁并调用析构函数。匿名对象的典型用法是临时定义对象,完成某项任务后立即销毁。

6.1 匿名对象的基本概念
匿名对象的定义:匿名对象是通过直接调用构造函数创建的对象,而没有为其指定名字。形式上,它看起来像 A() 或 A(1) 这样的表达式。

生命周期:匿名对象的生命周期非常短暂,只有在当前表达式结束时存在,表达式执行完毕后,匿名对象立即调用析构函数被销毁。

应用场景:匿名对象通常用于临时性操作,例如快速调用某个对象的成员函数或操作符,而不需要将该对象保存在变量中。

匿名对象 vs 有名对象
有名对象:对象名(实参)

例:B pro(10);(有名对象)
生命周期:与作用域相关,当作用域结束时对象销毁。
匿名对象:类型(实参)

例:B(5);(匿名对象)
生命周期:只在当前表达式有效,随后立即销毁。

6.2 匿名对象的创建与销毁

在C++中,通过 B() 或 B(10) 这样的语法直接调用构造函数来创建匿名对象,匿名对象没有名字,生命周期仅限于当前行,结束后立即调用析构函数进行销毁.

示例:

#include<iostream>
using namespace std;class A {
public:// 构造函数A(int a = 0) : _a(a) {cout << "A(int a) 构造函数被调用, _a = " << _a << endl;}// 析构函数~A() {cout << "~A() 析构函数被调用, _a = " << _a << endl;}private:int _a;
};int main() {A aa1;  // 有名对象 aa1 的创建// 不能这样定义对象,因为编译器无法确定是函数声明还是对象定义// A aa1();// 创建匿名对象并立即销毁A();    A(1);   A aa2(2);  // 有名对象 aa2 的创建,生命周期为整个作用域// 匿名对象用于调用函数,完成任务后立即销毁Solution().Sum_Solution(10);return 0;
}

输出:

A(int a) 构造函数被调用, _a = 0
~A() 析构函数被调用, _a = 0
A(int a) 构造函数被调用, _a = 1
~A() 析构函数被调用, _a = 1
A(int a) 构造函数被调用, _a = 2
~A() 析构函数被调用, _a = 2

解释

  • A() 和 A(1) 创建的是匿名对象,它们在当前语句结束后立即调用析构函数。
  • 有名对象 aa1 和 aa2 是在整个作用域内存在的,它们在作用域结束时调用析构函数。
  • 匿名对象 的使用场景之一是调用某个方法或操作符后立即销毁,不占用额外的资源。

6.3 匿名对象的应用场景

6.3.1 匿名对象用于临时调用成员函数

匿名对象的一个常见应用场景是用来临时调用某个类的成员函数,执行完任务后不需要该对象的存在。

class Solution {
public:int Sum_Solution(int n) {return n * (n + 1) / 2;}
};int main() {// 使用匿名对象调用 Sum_Solution 函数int result = Solution().Sum_Solution(10);  // 匿名对象创建后立即销毁cout << "Sum of 1 to 10: " << result << endl;return 0;
}

解释

  • 匿名对象 Solution() 被创建,用于调用 Sum_Solution 函数。函数调用结束后,匿名对象立即销毁,不再占用资源。
  • 这是一种常见的设计模式,适用于不需要保存对象状态的场景。

6.3.2 匿名对象避免对象命名

示例:返回匿名对象

class A {
public:A(int a) : _a(a) {cout << "A(int a) 构造函数被调用, _a = " << _a << endl;}~A() {cout << "~A() 析构函数被调用, _a = " << _a << endl;}private:int _a;
};// 函数返回一个匿名对象
A createA() {return A(100);  // 返回匿名对象
}int main() {createA();  // 调用 createA 函数,返回的匿名对象立即销毁return 0;
}

输出:

A(int a) 构造函数被调用, _a = 100
~A() 析构函数被调用, _a = 100

解释

  • 函数 createA 返回一个匿名对象,返回后立即销毁。
  • 匿名对象在不需要进一步使用的情况下,能够有效减少对象创建和销毁的负担。

6.4 匿名对象的注意事项

  1. 生命周期短暂:匿名对象的生命周期只在当前语句结束时有效,不能跨语句使用匿名对象。如果需要在多行代码中使用对象,必须创建有名对象。

    错误示例:

A obj = A(1);  // 正确,有名对象 obj
A(1).foo();    // 匿名对象调用方法
// A(1);        // 错误:匿名对象无法在下一行使用

2.编译器解析问题:在C++中,有些语法可能导致编译器误判为函数声明而不是对象创建。因此,注意避免如下情况:

错误示例:

A aa1();  // 被误判为函数声明,实际上不是对象的创建

正确用法:

A aa1(1);  // 明确创建对象

 3.匿名对象的返回值优化(RVO):现代C++编译器通常会对匿名对象进行优化,在返回对象时避免多余的拷贝操作。这种优化称为返回值优化(RVO)

总结

  • 匿名对象是没有名字的临时对象,生命周期非常短暂,通常用于一次性操作,如临时调用成员函数或返回值。
  • 匿名对象在表达式结束后立即调用析构函数销毁,适用于不需要持久化对象的场景。
  • 匿名对象避免了额外的命名和管理开销,在简化代码的同时提高了代码的简洁性和可读性。

相信通过这篇文章你对C++类与对象高级部分的有了初步的了解。如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会.

相关文章:

【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解

文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助&#xff01…...

模型训练进度条的代码

这个内容难在什么地方呢&#xff1f; 我想要跳转到另一个页面的时候 如何保存当前的训练状态&#xff0c;本来还想着加一个页面去管理进度的。然后想到了localstorage&#xff0c;将一些信息存储到浏览器中去。 进度条展示 <el-form-item label"训练进度" v-show…...

直观理解反向传播 | Chapter 3 | Deep Learning | 3Blue1Brown

目录 前言1. 简介2. 回顾3. 直观的演绎示例4. 随机梯度下降相关资料结语 前言 3Blue1Brown 视频笔记&#xff0c;仅供自己参考 这个章节主要来直观地理解反向传播算法到底在做什么 官网&#xff1a;https://www.3blue1brown.com 视频&#xff1a;https://www.bilibili.com/vide…...

052_python基于Python高校岗位招聘和分析平台

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…...

基于物联网、大数据、人工智能等技术开发的Spring Cloud 智慧工地云平台源码,支持多端应用

系统概述&#xff1a; 智慧工地是指运用现代信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;、云计算、移动互联网等&#xff0c;对传统建筑工地进行智能化改造和管理的新型工地。它通过高度集成的系统和设备&#xff…...

常见的跨境电商平台对比【总结表】

常见的跨境电商平台对比【总结表】 平台目标市场费用结构物流服务支付方式推广工具适合卖家亚马逊全球销售佣金、月租费、FBAFBA支持全球配送多种支付方式广告工具、促销活动有一定资金实力的品牌和卖家eBay全球上市费、成交费第三方物流支持PayPal、信用卡广告工具、促销活动…...

perl批量改文件后缀

perl批量改文件后缀 如题&#xff0c;perl批量改文件后缀&#xff0c;将已有的统一格式的文件后缀&#xff0c;修改为新的统一的文件后缀。 #!/bin/perl use 5.010;print "Please input file suffix which U want to rename!\n"; chomp (my $suffix_old <>)…...

【Python中的字符串处理】正则表达式与常用字符串操作技巧!

Python中的字符串处理&#xff1a;正则表达式与常用字符串操作技巧 Python 在字符串处理方面提供了丰富的内置功能和模块&#xff0c;能够帮助开发者处理各种复杂的文本操作。无论是简单的字符串拼接、替换&#xff0c;还是借助正则表达式&#xff08;re 模块&#xff09;实现…...

又是一年一度的1024,那就记录一篇算法博客吧~ 【二进制加法探秘】

前言&#xff1a; 又是一年一度的1024&#xff0c;那就记录一篇算法博客吧~ 内容如下~ 1 题目介绍 给定两个二进制字符串 a 和 b&#xff0c;需要返回它们的和&#xff0c;结果以二进制字符串形式给出。 示例 1&#xff1a; 输入: a “11”, b “1” 输出: “100” 示例 2…...

LeetCode--买卖股票的最佳时机含冷冻期--动态规划

一、题目解析 二、算法原理 我们可以使用dp[i]来表示第i天买卖股票所获得的最大利润。由题可得我们只能持有一支股票&#xff0c;并且在卖出后有冷冻期的限制&#xff0c;因此我们会有三种不同的状态&#xff1a; 我们目前持有一支股票&#xff0c;对应的「累计最大收益」记为…...

装了Ubuntu和Windows双系统,如何设置默认启动Windows

可以将默认启动系统设置为Windows&#xff0c;以下是步骤&#xff1a; 1. 修改GRUB配置文件&#xff1a; • 启动到Ubuntu&#xff0c;打开终端。 • 编辑GRUB配置文件&#xff1a; sudo nano /etc/default/grub • 找到这一行&#xff1a; GRUB_DEFAULT0 将0改为对应Wi…...

WPF+MVVM案例实战-设备状态LED灯变化实现

文章目录 1、项目创建2、UI界面布局1. MainWindow.xaml2、颜色转换器实现2.MainViewModel.cs 代码实现 3、运行效果4.源代码下载 1、项目创建 打开 VS2022 &#xff0c;新建项目 Wpf_Examples&#xff0c;创建各层级文件夹&#xff0c;安装 CommunityToolkit.Mvvm 和 Microsof…...

MySQL--基本介绍

一.数据库前言 1.数据库的相关介绍 关系数据库管理系统&#xff08;Relational Database Management System&#xff1a;RDBMS&#xff09;是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库&#xff0c;并将数…...

PAT甲级1008 Elevator

题目地址&#xff1a;1008 Elevator - PAT (Advanced Level) Practice (pintia.cn) 介绍 The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in spe…...

数据导入导出

1.数据加载 - LOAD 语法 LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename; 操作: 建表 CREATE TABLE myhive.test_load( dt string comment 时间&#xff08;时分秒&#xff09; , user_id string comment 用户 ID, word string comment 搜索词 , u…...

git的安装以及入门使用

文章目录 git的安装以及入门使用什么是git&#xff1f;git安装git官网 git初始化配置使用方式初始化配置&#xff1a; git的安装以及入门使用 什么是git&#xff1f; Git 是一个免费开源的分布式版本控制系统&#xff0c;使用特殊的仓库数据库记录文件变化。它记录每个文件的…...

【acwing】算法基础课-搜索与图论

目录 1、dfs(深度优先搜索) 1.1 排列数字 1.2 n皇后问题 搜索顺序1 搜索顺序2 2、bfs(广度优先搜索) 2.1 走迷宫 2.2 八数码 3、树与图的存储 4、树与图的遍历 4.1 树的重心 4.2 图中点的层次 5、拓扑排序 6、最短路问题 6.1 朴素Dijkstra算法 6.2 堆优化Dijks…...

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…...

面试经典算法题69-两数之和

面试经典算法题69-两数之和 公众号&#xff1a;阿Q技术站 LeetCode.1 问题描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。…...

在 Spring 框架中,循环依赖是指两个或多个 Bean 之间相互依赖

在 Spring 框架中&#xff0c;循环依赖是指两个或多个 Bean 之间相互依赖&#xff0c;形成一个闭环。例如&#xff0c;Bean A 依赖于 Bean B&#xff0c;而 Bean B 又依赖于 Bean A。这种情况如果不加以处理&#xff0c;会导致 Bean 无法正确实例化&#xff0c;从而引发应用程序…...

一文带你入门Flink CDC

1 CDC简介 1.1 什么是CDC CDC是Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 1.2 CDC的种类 CDC主要…...

修复jenkins SSH 免密登录发布服务器

SSH 免密登录配置和修复步骤&#xff1a; 1. 配置 SSH 免密登录 在本地主机执行以下命令&#xff0c;将公钥复制到目标服务器&#xff1a; ssh-copy-id bjpark172.27.xx.xx输入密码完成公钥传输。 2. 修复 SSH 免密登录失败的权限问题 如果免密登录失败&#xff0c;用root…...

049_python基于Python的热门微博数据可视化分析

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…...

中国信通院联合中国电促会开展电力行业企业开源典型实践案例征集

自2021年被首次写入国家“十四五”规划以来&#xff0c;开源技术发展凭借其平等、开放、协作、共享的优秀创作模式&#xff0c;正持续成为推动数字技术创新、优化软件生产模式、赋能传统行业转型升级、助力企业降本增效的重要引擎。电力是国民经济的重要基础性产业&#xff0c;…...

LOAM 20.04 ros1安装

LOAM 安装 LOAM源码 安装参考 上述安装参考在 报错1、 C标准改为17 解决方案 数据集 试车实验...

Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)

目录 专栏导读库的安装代码介绍完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &#x1f44d; 该系列文…...

mysqldump 批量导出数据库表

先查询需要导出的数据表&#xff0c;使用语句 SELECT table_name FROM information_schema.tables WHERE table_schema 数据库名 AND table_name LIKE mall%; 再批量导出查询到的表 mysqldump -u root -p test_yogasala mall_ad mall_address mall_admin mall_cart mall_…...

前端工程师面试题整理

前言 本文整理了一系列前端工程师面试中常见的 HTML、CSS 和 JavaScript 问题及其答案&#xff0c;涵盖基础知识、常见问题及面试技巧。适用于准备前端开发职位面试的候选人参考。 目录 前言HTML & CSS1. 对 WEB 标准以及 W3C 的理解与认识2. XHTML 和 HTML 有什么区别3.…...

Linux 权限的理解

内容摘要 本文内容包括shell的运行原理&#xff0c;包括外壳程序的原理、理解、和意义&#xff0c;以及从两个方面对于权限的理解&#xff08;人和事物的属性&#xff09;、修改文件的权限&#xff0c;包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用…...

『完整代码』按钮开关UI界面

创建按钮Button 作为开关坐骑UI界面的按钮 创建Image 作为坐骑UI界面 在父类脚本添加其中函数即可 绑定脚本在父类窗口对象 在按钮上响应事件 隐藏UI界面 运行项目 - 实现点击按钮开关UI界面 再次点击按钮 - 关闭UI界面 end...

做网站运营工资多少/广告推广的软件

TimesTen学习&#xff08;一&#xff09;安装篇 http://blog.itpub.net/23135684/viewspace-717741/这篇文章主要讨论连接并创建第一个数据库。1.timesten操作系统用户环境变量设置。alias ls"ls -FA"#ODBCINI#SYSODBCINI#SYSTTCONNECTINI TNS_ADMIN/home/timesten/T…...

网站除了做流量还需要什么软件/亿驱动力竞价托管

File f new File("~"); //创建源InputStream is new FileInputStream(f); //选择流is.read() 读取单个数据&#xff0c;并使游标下移 //操作(读取)is.close() //释放资源,输入流读取后必须释放资源public class test{public static void main(String[]args){//创建源…...

上海南站网站建设公司/包头整站优化

点击蓝字关注我们什么是函数的返回值&#xff1f;C语言函数如果执行成功的话&#xff0c;返回1、返回0还是返回别的值&#xff1f;如果大家还不是很清楚&#xff0c;那么就让小橙同学来给大家介绍一下。C语言简介首先&#xff0c;简单介绍一下C语言。C 语言是一种通用的、面向过…...

龙之向导外贸网站怎么样/贺州seo

最近有同事需求&#xff0c;作的专题需要一个投票功能&#xff0c;商讨后看了下社区的投票代码&#xff0c;感慨良多&#xff0c;决定用redis做一个单纯的投票数据处理&#xff0c;以方便后续对社区投票的修改 所以功能就很简单&#xff0c;不考虑选项&#xff0c;内容等存储&a…...

网站备案真实性核验委托书/腾讯企点app下载安装

这个搞得有点久&#xff0c;不过&#xff0c;还算完美解决。 主要是前端NGINX&#xff0c;后端也是NGINX。 前端的NGINX不好作相关的URL权限限制&#xff0c;因为所有的URL在CI里都要经过INDEX.PHP重定向。 并且&#xff0c;在后端NGINX作限制&#xff0c;更比前端安全。 我大约…...

网站制作怎样盈利/怎么做产品推广和宣传

本篇文章主要给大家介绍网页html文字滚动代码效果如何写&#xff1f;当我们在浏览新闻播放的页面时&#xff0c;总会看到底部有一段实时新闻不停的滚动出现&#xff0c;这样的效果通常可以由js或者css来完成操作。下面给大家具体介绍两种方法&#xff0c;一、js文字滚动代码具体…...