【C++】类和对象(下篇)

news2025/2/25 7:34:22

C++类和对象下篇

    • 构造函数的一点补充
      • 构造函数体赋值
      • 初始化列表
      • explicit关键字
    • Static成员
      • 概念
      • 特性
    • 友元
      • 友元函数
      • 友元类
    • 内部类
      • 概念
      • 特性
    • 匿名对象
    • 拷贝对象时的一些编译器优化
    • 几道例题

在这里插入图片描述

构造函数的一点补充

构造函数体赋值

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

编译器默认生成的构造函数对内置类型不处理(默认构造函数有三种,自己没写编译器默认生成的,自己写了但是没有参数的和自己写了但是是全缺省参数的,如果不清楚请看我的上一篇博客:类和对象中篇),对自定义类型会调用其默认构造函数,但是如果自定义类型的默认构造函数是编译器自动生成的话,又是对自定义类型的内置类型没做什么处理,以此类推。如果一直套娃下去,而且所有的自定义类型的类都是编译器默认生成的构造函数,那等于说是啥都没干。但是如果我们想要不用默认构造函数就能初始化自定义类型呢?

代码如下:
例1:

class Time
{
private:
	int _hour;
};

class Date
{
public:
	Date(int year = 1949)
	{
		_year = year;
	}
private:
	int _year;
	Time _t;
};

上面的Time类中,有一个编译器默认生成的构造函数。
Date类中我显示定义了一个Date的构造函数。还定义了一个自定义类型_t;

此时我编译:
在这里插入图片描述
会出现一个警告,写的是_t未初始化。

我给Time类型加上构造函数并且为其成员变量_t赋值后(没有赋值的话还是会警告),警告消失。
在这里插入图片描述
但是想要不用默认构造还赋值一个我们想用的值,可以不?
在这里插入图片描述

当Time没有默认构造的时候,还要分两种情况:

  1. Date没有显示写默认构造:
class Time
{
public:
	Time(int hour)
	{
		_hour = 0;
	}
private:
	int _hour;
};

class Date
{
private:
	int _year;
	Time _t;
};

在这里插入图片描述
报错的是Date类的。因为Time类中没有默认构造函数,而Date在生成d的时候还是要调用Time的默认构造函数的,但是Date类调不动,因为根本没有。

  1. Date显示写了构造函数:
class Time
{
public:
	Time(int hour)//不是默认构造
	{
		_hour = 0;
	}
private:
	int _hour;
};

class Date
{
public:
	Date(int year)//Date的构造函数
	{
		_year = year;
	}

private:
	int _year;
	Time _t;
};

会报错:
在这里插入图片描述
上面Time类中的构造函数不是默认构造函数,有参但不是全缺省。

再改改:
在这里插入图片描述
在Date构造函数中再搞一个Time类t, 然后将t赋值给_t(这里是默认的赋值运算符重载,如果不了解,还是先看看我的类和对象中篇),还是有问题,好像必须要调用默认构造函数才行,但是也未必,我们可以看到,Date构造函数 { 下边有报错,为啥是这里报错呢?

上面说了一堆,比较模糊,只是为了引出一个东西:初始化列表。

初始化列表

先看看长啥样:
在这里插入图片描述

在这里插入图片描述
这里的Time类里面可是没有默认构造函数的。

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

class Date
{
public:
Date(int year, int month, int day)
     : _year(year)
     , _month(month)
     , _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};

初始化列表可以认为是成员变量定义的地方。
而上面的int _year; int _month; int _day; 都是声明。不是在定义,这一点应该是刚学类和对象那会就要清楚的。

还是以刚刚的Date和Time类为例,说三点:

  1. 当Time类没有默认构造函数时,必须在Date的构造函数中使用初始化列表。
  2. 当Time有默认构造时,不用显示使用初始化列表,但还是会在Date构造函数处使用初始化列表来调用Time的默认构造函数。
  3. Time有默认全缺省的构造函数时,可以在Date构造函数的初始化列表处使用全缺省构造函数来直接为Time类成员变量进行非缺省参数的初始化。

2和3给俩例子。

2:
在这里插入图片描述

3:
在这里插入图片描述
在这里插入图片描述

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

引用成员变量
const成员变量
自定义类型成员(且该类没有默认构造函数时)

给个例子:
在这里插入图片描述
3. 不管是内置类型还是自定义类型,能用初始化列表初始化就用,使用初始化列表基本没什么毛病。但是也有在函数体内初始化的场景,这里把例子给出来:
在这里插入图片描述
在这里插入图片描述
这样看起来会舒服很多。

  1. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

直接给例题:

四选一:
A. 输出1  1
B.程序崩溃
C.编译不通过
D.输出1  随机值

class A
{
public:
	A(int a)
		:_a1(a)
		, _a2(_a1)
	{}

	void Print() 
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a2;
	int _a1;
};
int main() 
{
	A aa(1);
	aa.Print();
}

上面第四点可以说是已经把答案说出来了。这里再解释一下,初始化时不会按照初始化列表的顺序,而是按照成员变量声明的顺序初始化。所以是先初始化_a2,此时_a1为随机值,所以给_a2也是随机值,然后再初始化_a1为1。

所以答案是:D。

explicit关键字

构造函数不仅可以初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。用explicit修饰构造函数,将会禁止构造函数的隐式转换。

什么意思?
还是先给例子:
在这里插入图片描述
d2在定义的时候,会调用构造函数,是因为发生了隐式类型转换。

赋值运算符在给某一变量赋值的时候,会先为右侧数值做一个临时拷贝,然后再将这个拷贝的东西赋值给左侧变量,所以理论上讲d2在初始化前,右侧会以2022这个数先构造一个临时的Date对象(临时对象具有常属性),这个对象中year的值就是2022,然后再将这个临时对象拷贝给d2,但实际上并不是这么做的。

实际上时直接调用了构造函数。这是 构造 + 拷贝构造 + 编译器优化 -> 直接调用构造函数。

再给个例子:
在这里插入图片描述
加个引用就不行了。因为临时对象具有常属性,不能被修改,给引用就可以通过d3来改那个临时拷贝了,但是不能那么做,权限会被放大(权限只能缩小或者平移)。

这一点就类似于:
在这里插入图片描述

再看:
在这里插入图片描述
加上const就可以了,因为加了const就不能通过d3来改变那个临时数据了。

在这里插入图片描述

那我不想让d2发生隐式转换呢?
在构造函数前加explicit就好了。
在这里插入图片描述

在这里插入图片描述
这个就解释到这,以后会讲到这个的使用场景。但是是不加explicit的使用场景。

Static成员

C语言也学过static了,这里是C++的类里面static的用法。

概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定
要在类外进行初始化。

看看长啥样:
静态成员变量:
在这里插入图片描述
静态成员函数:
在这里插入图片描述

特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类的静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

静态成员变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。
静态成员变量必须在类中声明,在类外定义。
静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。

这一点与类对象共享函数代码很类似。

第一点就不解释了。
第二点刚刚给的例子中就有。

说第三点(和第一点结合):
在这里插入图片描述

第四点:
在这里插入图片描述
在这里插入图片描述
其实第四点归根到底就是因为静态成员函数中没有隐藏的this指针。

第五点:
在这里插入图片描述

说一下第五点的使用场景:
写一个只能在栈上定义对象的类
先动脑想想。
.
.
.
.
.
.
.
答案:
在这里插入图片描述

面试题:实现一个类,计算程序中创建出了多少个类对象。

class A
{
public:
	A()
	{
		_i++;//每创建一个变量就让_i加一次。
	}

	static void NumOfCreateA()
	{
		cout << _i << endl;
	}

private:
	static int _i;
};
int A::_i = 0;
int main()
{
	A a[100];
	A::NumOfCreateA();
	return 0;
}

在这里插入图片描述

再来道题:
牛客JZ64

我写了两个,
第一个:

class sum
{
public:
    sum()
    {
        _sum += _i;
        _i++;
    }

    static int Sum(int n) 
    {
        return _sum;
    }
private:
    static int _i;
    static int _sum;
};
int sum::_i = 1;
int sum::_sum = 0;

class Solution 
{
public:
    int Sum_Solution(int n)
    {
        sum s[n];//这里的变长数组可以直接用n
        return sum::Sum(n);
    }
};

第二个:

class Solution 
{
public:
    Solution()
    {
        _sum += _i;
        _i++;
    }
    static int Sum_Solution(int n) 
    {
        Solution s[n - 1];//这里的变长数组只能用n-1
        //我猜是后台在实现的时候还定义了一个Solution
        //的对象,然后导致多加了一次
        return _sum;
    }
private:
    static int _i;
    static int _sum;
};
int Solution::_i = 1;
int Solution::_sum = 0;

静态的就讲到这,下面讲讲友元。

友元

中篇讲运算符重载的时候应该是要提一下这个友元的,不过给整忘了,这里补上。

友元分为:友元函数和友元类

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

上面这句话说的太专业化了,说人话就是能不用友元就尽量不用。

友元函数

Date类,想要直接用 cout 打印,需要对 << 运算符进行重载。

但是不能重载到类内,因为 << 是一个二元运算符,重载的函数左参数一定是this指针,也就是左操作数,右操作数(右参数)是ostream类型的对象,这样就很鸡肋了,用起来就变成了这样:
在这里插入图片描述
如果我把cout和d换个位置就会报错:
在这里插入图片描述
因为在调用 << 的时候this指针占了左参数,cout就必须放在右边了。
但是我如果接着用左边是d右边是cout的话,就不能连续打印了。
在这里插入图片描述
所以说不能在类内重载 << 运算符。

那就得在类外了。

但是在类外想要访问类的私有成员,要么再定义函数,要么就用友元。
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

在这里插入图片描述
上面就是友元的一个使用场景。

友元函数可访问类的私有和保护成员,但不是类的成员函数

友元函数不能用const修饰(const是用来修饰this指针的,友元函数没有)

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

一个函数可以是多个类的友元函数
比如fun(A& a, B& b, C& c)就可以在ABC类中都声明一下友元函数func。

友元函数的调用与普通函数的调用原理相同

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

友元关系是单向的,不具有交换性。

例如:前面的Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

用一句话说就是你的是我的,我的还是我的。

友元关系不能传递
例如:如果C是B的友元, B是A的友元,则不能说明C是A的友元。

友元关系不能继承,等讲到继承了再给大家详细介绍。

class Time
{
	friend class Date; 
public:
	Time(int hour = 0, int minute = 0, int second = 0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{}

private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
	void SetTimeOfDate(int hour, int minute, int second)
	{
		// 直接访问时间类私有的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

上面的Date类就能直接用Time类中的所有成员了。

内部类

概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

特性

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。

第一点就不给例子了。

第二点,上一个友元,友元类在访问另一个类的static的时候还要用 类的对象/类名 来访问静态成员。但是内部类不需要。

上例子:

class Time
{
public:
	Time(int hour = 0, int minute = 0, int second = 0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{}
	class Date//Date天生就是Time的友元
	{
	public:
		Date(int year = 1900, int month = 1, int day = 1)
			: _year(year)
			, _month(month)
			, _day(day)
		{
			cout << _si << endl;
		}
	private:
		int _year;
		int _month;
		int _day;
	};
private:
	int _hour;
	int _minute;
	int _second;
	static int _si;
};

int Time::_si = 0;

第三点:
在这里插入图片描述

用Date类定义对象的时候要用到Time类。
在这里插入图片描述
直接用Date会报错。
在这里插入图片描述

记住:
B类定义在A类的里面

  1. 仅受A的类域的限制,也就是在用B定义对象的时候要用A::B来定义。
  2. B天生是A的友元

A就和B没啥别的关系了。

匿名对象

长这样:
在这里插入图片描述
匿名对象的生命周期只在当前行,过了当前行就原地去世了。## 拷贝对象时的一些编译器优化。

续着刚刚上面的内部类,还可以这样用:
在这里插入图片描述
这就是匿名对象。
在定义一下析构函数我们来证明一下其生命周期只有一行:
在这里插入图片描述
在这里插入图片描述

拷贝对象时的一些编译器优化

在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。

比如说我们前面说到的类对象定义时的隐式类型转换。本来应该是构造 + 拷贝构造,变成了仅构造。这就是编译器的优化。但有的老编译器就优化不了。

再举一个场景。

类定义如下:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << 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;
};

下面的例子都是针对上面的类型来出的:

例一:
在这里插入图片描述

例二
在这里插入图片描述

例三:
在这里插入图片描述

例四:
在这里插入图片描述

例五:
在这里插入图片描述

例六:
在这里插入图片描述

反正就是某种条件下,编译器为了提高效率会进行自动优化,而且debug和release版本下优化的程度是不一样的。

上面的了解了解就ok了,我水平也没那么高,讲不了那么深。。。

几道例题

  1. 计算日期到天数的转换
  2. 日期差值
  3. 打印日期
  4. 累加天数

到这里类和对象就讲完了,上面的例题完全可以做了。

到此结束。。。

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

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

相关文章

股票量价关系基础知识2

内盘与外盘 外盘&#xff0c;是指在一个交易日获某段交易时间内&#xff0c;买方主动提价以委卖价成交的股数之和&#xff0c;也称为主动性买盘 内盘&#xff0c;是指在一个交易日获某段交易时间内&#xff0c;卖方主动降价以委买价成交的股数之和&#xff0c;也称主动性卖盘。…

flstudio20没有language选项,fl 21怎么也没有language选项

最新小伙伴们安装flstudio20没有language选项&#xff0c;是什么原因导致flstudio20没有language选项&#xff0c;兔八哥爱分享测试了&#xff0c;应该是flstudio20版本太低了&#xff0c;建议安装flstudio20.8以上版本&#xff0c;才可以flstudio20.8语言切换中文版。 flstud…

05- redis集群模式搭建(上) (包含云服务器[有坑])

目录 1. 准备环境: 2. 简介: -> 2.1 前言: -> 2.2 Redis集群架构实现了对redis的水平扩容 -> 2.3 redis cluster集群原理 3. 搭建后特别需要注意的问题 ->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务??? ---> 3.1.1 如果集群中故障re…

C++系列八:选择、循环与转向

选择、循环与转向 1. 选择语句2. 循环语句3. 转向语句4. 总结 1. 选择语句 选择语句使用条件来确定程序将执行哪些代码。在C编程中&#xff0c;选择语句有多种类型&#xff0c;包括if语句、switch语句和三元运算符。 &#xff08;1&#xff09;if语句 if语句是C编程中最常见…

Oracle EBS Interface/API(49)- AP付款取消API

快速参考 参考点内容功能导航N: AP->付款->录入->付款并发请求None基表AP.AP_CHECKS_ALLAPI参考下面介绍错误信息表None接口FormNone接口ReportNoneDebug ProfileNone详细例子参考如下实例官方文档None数据验证包None用户界面 Path:AP->付款->录入->付款-&g…

UNIX网络编程卷一 学习笔记 第十三章 守护进程和inetd超级服务器

守护进程是在后台运行且不与任何控制终端关联的进程。Unix系统通常有很多守护进程在后台运行&#xff08;约20到50个的量级&#xff09;&#xff0c;执行不同的管理任务。 守护进程由系统初始化脚本&#xff08;在开机时运行&#xff09;启动&#xff0c;而没有控制终端是系统…

华为交换机特殊场景使用mux vlan

场景主要用于&#xff1a; 设置两个vlan&#xff0c;每个vlan内的所有用户自动获取地址和能上外网&#xff0c;但是自个valn间用户都不能互相访问&#xff0c;每个用户又都可以 和其它vlan的用户通信。 官方版&#xff1a; 操作步骤 1.配置MUX VLAN 创建VLAN2、VLAN3和VLAN…

Python综合案例—利用tkinter实现计算器的程序

目录 一、导入 tkinter 库 定义全局变量 二、定义回调函数 三、创建窗口对象 四、创建标签控件 五、创建数字按钮 六、创建加、减、乘、除和等于按钮 七、创建清空按钮 八、总结 用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念&a…

知识变现海哥:掌握这四个步骤,轻松实现知识变现

你是否有过这种感受&#xff0c;看了很多书&#xff0c;网上报课花了很多钱&#xff0c;课程屯了很多&#xff0c;可是依然很难变现&#xff0c;问题出在哪里呢&#xff1f; 海哥写这本《知识变现道法术器》将为你揭开答案。 海哥&#xff0c;国内知名知识变现创业教练&#x…

Java开发 - 不知道算不算详细的MySQL多维度性能优化剖析

前言 MySQL性能优化是一个很大的话题&#xff0c;小到一句SQL&#xff0c;大到一个系统&#xff0c;都是我们优化的目标&#xff0c;博主之前曾写过一篇关于SQL优化的博客&#xff0c;感兴趣的小伙伴直接点击即可。本篇&#xff0c;我们将从多个维度来讲解MYSQL性能优化相关的…

【Python】朴实无华的yolov5环境配置

前言 最近有一个项目需要用到目标识别&#xff0c;于是我一下子就想到了大名鼎鼎的yolo&#xff0c;于是花了一天时间了解了一下。但是很遗憾的是&#xff0c;我自己随便配置的一个环境能运行torch&#xff0c;但是只要一训练yolov5的库&#xff0c;电脑就要蓝屏&#xff0c; 随…

为什么是ChatGPT引发了AI浪潮?

目录 BERT和GPT简介 BERT和GPT核心差异 GPT的优势 GPT的劣势 总结 随着近期ChatGPT的火热&#xff0c;引发各行各业都开始讨论AI&#xff0c;以及AI可以如何应用到各个细分场景。为了不被时代“抛弃”&#xff0c;我也投入了相当的精力用于研究和探索。但在试验的过程中&…

FE_Vue学习笔记 插槽 slot

插槽分为匿名插槽、具名插槽、作用域插槽。子组件中&#xff1a; 匿名插槽只能有一个&#xff1b;可以有多个具名插槽&#xff1b;作用域插槽中可以有匿名插槽和具名插槽。 当项目中一个组件可以多次复用时&#xff0c;我们可以把这个组件封装成单独的.vue文件&#xff0c;从…

【UDS】ISO15765-2之网络时间参数

文章目录 简介分类1. N_As2. N_Ar3. N_Bs4. N_Br5. N_Cs5. N_Cr 总结 ->返回总目录<- 简介 网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。 这些时间参数在多帧传输中可以定义在下图的过程中 分类 1. N_As 方向&#xff1a; 发送方->接收方 …

听我一句劝,不要去外包,两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近5年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

springmvc执行请求的顺序

当一个请求执行时&#xff0c;springMVC的DispatcherServlet&#xff08;前端控制器&#xff09; 会拦截到他&#xff0c;然后调用HandlerMapping &#xff08;处理器映射器&#xff09;&#xff0c;找到对应的URL地址&#xff0c;然后返回给前端控制器。前端控制器根据返回的U…

基于列系数比较一组迭代次数的顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中每行有1个1&#xff0c;B中全是0&#xff0c;排列组合A &#xff0c;统计迭代次数的顺序。共有729组不同的排列组合&#xff0c;但按照对称性只有26…

第一个Go语言程序

第一个Go语言程序 目录 第一个Go语言程序引言Go的开发环境安装GoPATH编辑器 第一个Go程序总结 引言 本系列博客将手把手带着大家从零基础入门go语言&#xff0c;不定时更新吧&#xff0c;自己学到哪就更新到哪&#xff0c;先讲讲为什么要学习go语言&#xff1a;列出以下几点go…

<TensorRT> 下载及部署

TensorRT-下载及部署 1、下载前相关查询 查看显卡驱动版本&#xff1a;nvidia-smi 查看cuda版本&#xff1a;nvcc -V cuda与显卡驱动对应表&#xff1a;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-new-features TensorRT兼容性查询&#…

详解静态、动态代理以及应用场景

一篇不太一样的代理模式详解&#xff0c;仔细阅读&#xff0c;你一定会获取不一样的代理见解&#xff0c;而不是人云亦云。 查看了社区里关于代理模式描述&#xff0c;发现很多博客千篇一律甚至存在共性错误&#xff0c;写此文提出自己对代理的见解。 静态代理动态代理 JDKCGLi…