【C++】—— 类与对象(五)
【C++】—— 类与对象(五)
- 1、类型转换
- 1.1、类型转换介绍
- 1.2、类型转换的应用
- 1.3、explicit 关键字
- 2、static 静态成员
- 2.1、static 静态成员变量
- 2.2、static 静态成员函数
- 2.3、总结
- 3、友元
- 3.1、友元函数
- 3.2、友元类
- 4.内部类
- 5、匿名对象
- 6、对象拷贝时的编译器优化
- 6.1、情况一:类型转换
- 6.2、情况二:传值传参
- 6.3、情况三:传值返回
1、类型转换
1.1、类型转换介绍
我们知道,整型和浮点型之间可以发生隐式类型转换
int main()
{int a = 2.2;cout << a << endl;return 0;
}
运行结果:
int a = 2.2;
这句代码,会发生隐式类型转换
。中间生成一个临时对象
,将右操作数强制类型转换为左操作数的类型,再将临时对象的值赋值给 a a a。
那么下面代码小伙伴们见过吗
class A
{
public :A(int a1): _a1(a1){}A(int a1, int a2):_a1(a1), _a2(a2){}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a1 = 1;int _a2 = 2;
};int main()
{A aa1(5);aa1.Print();A aa2 = 10;aa2.Print();return 0;
}
运行结果:
诶?是不是感觉怪怪的
A aa1(5);
很好理解,就是调用构造函数。那A aa2 = 10;
又该怎么理解呢?是拷贝构造吗?如果是拷贝构造那不应该用同类的对象来初始化吗?怎么现在是一个整型呢?
A aa2 = 10;
本质是一个类型转换,10 从一个整型转换成了 A 类,其用 10 去 构造 了一个临时对象
A类
,再通过拷贝构造初始化 a a 2 aa2 aa2
不过编译器会对上述过程进行优化,优化为直接构造
。虽然语法意义上面是走上述步骤。
int main()
{A aa1(5);aa1.Print();A& aa1 = 10;return 0;
}
这样引用行不行呢?
不行的,因为类型转换会产生一个临时对象
,临时对象是常性
。
用 c o n s t const const 引用:const A& aa1 = 10;
就可以啦
那多参数的可以吗?
可以的,C++11 后支持了多参数的类型转换
调用方法如下:
int main()
{A aa1 = { 3,3 };aa1.Print();return 0;
}
1.2、类型转换的应用
class Stack
{
public:void Push(const A& aa){//···}
private:A _arr[10];int _top;
};
现在,我们有一个栈,栈放着 A类 成员,怎么插入数据呢?
正常来讲是这样写
int main()
{Stack st;A aa1(1);st.Push(aa1);A aa2(2,2);st.Push(aa2);return 0;
}
有了类型转换后,我们就可以这样
int main()
{Stack st;st.Push(1);st.Push({2,2});return 0;
}
效果是一样的,但代码简洁了许多
这里 1 和 2.2 会构建一个临时对象
,再将临时对象 P u s h Push Push
这里,也体现了加引用尽量加 c o n s t const const 的重要性。因为临时对象具有常性
,不加 c o n s t const const 会造成权限放大
,编译无法通过。
1.3、explicit 关键字
如果我们不想让它发生类型转换
,可以增加 e x p l i c i t explicit explicit 关键字
class A
{
public :explicit A(int a1): _a1(a1){}explicit A(int a1, int a2):_a1(a1), _a2(a2){}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a1 = 1;int _a2 = 2;
};
2、static 静态成员
2.1、static 静态成员变量
- 用 s t a t i c static static 修饰的成员变量,称之为
静态成员变量
,静态成员变量一定要在类外进行初始化- 静态成员变量为
所有当前类对象所共享
,不属于某个具体的对象,不存在对象中,存放在静态区
class A
{
public :A(){++_scount;} A(const A& t){++_scount;} ~A(){--_scount;} //private:// 类⾥⾯声明static int _scount;// 声明时可以给缺省值吗?//static int _scount = 0;
};//在类外初始化
int A::_scount = 0;int main()
{//指定类域就可以访问_scount(公有情况下)//因为_scount并不在某个对象中//cout << A::_scount << endl;cout << sizeof(A) << endl;return 0;
}
运行结果:
上述代码中static int _scount;
就是在类中定义了一个静态成员变量。
int A::_scount = 1;
是 _ s c o u n t scount scount 的声明,静态成员变量 一定要在类外声明
静态成员变量可以认为是全局变量,放在静态区
,并不是存在类中(通过 s i z e o f sizeof sizeof 也可看出),只是受类域的限制,受访问限定符限制
静态成员变量 在 m a i n main main函数 之前就开辟好了,并不随对象一起开辟
可以通过直接指定类域区访问静态成员变量:类名::静态成员
,因为它不是在某个对象中(公有情况下)
那在类中声明时,可以给缺省值吗?
不可以,因为声明时的缺省值是给初始化列
表用的,静态成员变量不是存在类里面的,不走初始化列表。
2.2、static 静态成员函数
- 用 s t a t i c static static 修饰的成员函数,称之为静态成员函数,静态成员函数没有 t h i s this this指针
- 静态成员函数
可以访问其他静态成员
,但是不能访问非静态的
,因为没有 t h i s this this指针- 非静态的成员函数,可以
访问任意的静态成员变量和静态成员函数
class A
{
public :A(){++_scount;} A(const A& t){++_scount;} ~A(){--_scount;} //静态成员函数static int GetACount(){return _scount;}private:// 类⾥⾯声明static int _scount;
};
当静态成员变量是私有,就无法直接突破类域访问,这时就可以使用静态成员函数来访问。
静态成员函数没有 t h i s this this指针,因此只能访问静态成员变量。
静态成员函数同样可以通过通过 类名::静态函数
访问;当然,也可以像普通成员函数那样通过 对象.函数
来访问
int A::_scount = 1;
int main()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;cout << a1.GetACount() << endl;return 0;
}
运行结果:
int main()
{cout << A::GetACount() << endl;A a1, a2;{A a3(a1);cout << A::GetACount() << endl;}cout << a1.GetACount() << endl;return 0;
}
运行结果:
上述代码利用静态成员变量来计算该对象实例化出多少个对象。
注:在 C++ 中,任意一个 { }
中的内容都单独形成一个域。 a 3 a3 a3 是在域中创建,出了作用域就销毁
同时静态成员函数只能访问静态成员变量,因为静态成员函数没有 t h i s this this 指针
static int GetACount(){_a++;return _scount;}
但是非静态成员函数可以随便访问静态成员变量和静态成员函数
,因为突破类域就可以访问静态成员,而非静态成员函数本来就在域中。
2.3、总结
- 用 s t a t i c static static 修饰的成员变量,称之为静态成员变量,静态成员变量一定要在
类外初始化
- 静态成员是为
所有类对象所共
享,不属于某个具体的对象,不存在对象中,存放在静态区- 用 s t a t i c static static 修饰的成员函数,称之为静态成员函数,静态成员函数没有 t h i s this this指针
静态成员函数
中可以访问其他静态成员
,但是不能访问非静态
的,因为没有 t h i s this this指针非静态的成员函数
,可以访问任意的静态成员变量和静态成员函数- 突破类yu就可以访问静态成员,可以通过
类名::静态成员
或者对象.静态成员
来访问静态成员变量和静态成员函数- 静态成员也是
类的成员
,受 p u b l i c public public、 p r o t e c t e d protected protected、 p r i v a t e private private 访问限定符的限制- 静态成员变量
不能在声明位置给缺省值初始化
,因为缺省值是用来给构造函数初始化列表的
,静态成员变量不属于某个对象,不走构造函数初始化列表。
设已经有A,B,C,D 4个类的定义,程序中A,B,C,D构造函数调用顺序为?()
设已经有A,B,C,D 4个类的定义,程序中A,B,C,D析构函数调用顺序为?()
//A:D B A C
//B:B A D C
//C:C D B A
//D:A B D C
//E:C A B D
//F:C D A BC c;
int main()
{A a;B b;static D d;return 0;
}
- 选:E
A、B、C的初始化顺序相信大家都没问题,那 D 是什么时候初始化呢?
局部的静态变量是在第一次运行到该位置才初始化
- 选:B
首先,对 B 和 A,后定义的先定义的先析构,B 肯定在 A 之前
因为 C 和 D 的声明周期是全局的,所以他们的析构肯定在 A 和 B 之后。再先析构 D,最后才是 C
3、友元
友元提供了一种突破访问限定符封装的方式,友元分为:友元函数
和友元类
,在函数声明或类声明前加关键字 f r i e n d friend friend,并且把友元声明放到一个类的里面
3.1、友元函数
有些情况,函数无法定义在类里面(如:不想 t h i s this this指针放在第一个参数位置),但是函数又必须访问类中的成员变量(operator<<
详情情看:)。
怎么办呢?这时 C++ 提供了友元这种突破访问限定符的方式
。让类外的函数可以访问类中私有的成员变量
打个比方:小刚家有个大泳池,小明一直想去小刚家里游泳,但他们两人并不熟,这时小明肯定无法去游的。怎么办呢?小明选择和小刚交往,成为小刚的朋友,这时小明就可以去小刚家游泳啦
友元函数的基本知识:
外部友元函数可以访问类的私有和保护成员
,友元函数仅仅是一种声明,他不是类的成员函数- 友元函数可以在类定义的任何地方声明,不受类访问限定符的限制
- 一个函数可以是
多个
类的友元函数
友元声明没有明确规定放在哪个位置,但一般都是放在类的最上面
// 前置声明,都则A的友元函数声明编译器不认识B
class B;class A
{// 友元声明friend void func(const A& aa, const B& bb);private:int _a1 = 1;int _a2 = 2;
};
class B
{// 友元声明friend void func(const A & aa, const B & bb);private:int _b1 = 3;int _b2 = 4;
};
void func(const A& aa, const B& bb)
{cout << aa._a1 << endl;cout << bb._b1 << endl;
}
一个函数可以成为多个类的友元(我多交几个朋友不过分吧)
注:编译器有一个原则:我要用任何类型的变量都要向上找
。上述代码要给 c l a s s class class B 一个前置声明,否则friend void func(const A& aa, const B& bb);
中 c l a s s class class A 不认识 const B& bb
中的 B。
3.2、友元类
友元类的基本知识:
- 友元类中的成员函数都是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
- 友元类的关系是单向的,不具有交换性,比如 A 类是 B 类的友元,但是 B 类不是 A 类的友元。
- 友元关系不能传递,如果 A 是 B 的友元,B 是 C 的友元,但是 A 不是 B 的友元。
当一个类需要大量的去访问另外一个类,如果仅仅是把成员函数定义成别人的友元会很不方便,这时就可以使用友元类。
class A
{// 友元声明friend class B;private:int _a1 = 1;int _a2 = 2;
};
class B
{
public :void func1(const A& aa){cout << aa._a1 << endl;cout << _b1 << endl;} void func2(const A& aa){cout << aa._a2 << endl;cout << _b2 << endl;}
private:int _b1 = 3;int _b2 = 4;
};int main()
{A aa;B bb;bb.func1(aa);bb.func1(aa);return 0;
}
运行结果:
友元类就是:我的所有成员函数都是你的友元函数
友元类是单向性的,上述代码 B 是 A 的友元,但 A 不是 B 的友元,A 是不能访问 B 中的成员变量的。如果 A 的成员函数也想访问 B 中的成员变量,可以在 B 中加入 A 的友元声明,这样就可以互相访问啦。
- 虽然友元提供了便利,但是友元会增加耦合度,破坏了封装,所以
友元不宜多用
4.内部类
我们能不能把一个类定义在另一个类的里面呢?可以的,这就是内部类
class A
{
private :static int _k;int _h = 1;
public:class B {public :void foo(const A & a){cout << _k << endl; cout << a._h << endl; }private:int _b;};
};int main()
{cout << sizeof(A) << endl;return 0;
}
上述代码中 B 就是 A 的内部类
那么问题来了,A 的大小是多少呢?它的大小会算上 B 类的大小吗?
我们来看下运行结果:
可以看到 A 的大小是不计算
B 的
- 如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只受外部类
类域限制和访问限定符限制
,所以外部类定义的对象中 不包含内部类。
因为内部类受到外部类的限制,所以访问内部类B需要指定类域
它也受 A 访问限定符的限制
,如果 B 定义在 A 的私有,那么外面就无法访问到 B 了。
- 内部类默认是外部类的 友元类
也就是说默认 B 是 A 的友元,B 可以直接访问 A 的私有,但 A 无法访问 B 的私有
- 内部类本质也是一种封装,当 A 类和 B 类紧密关联,
A 类实现出来主要就是给 B 类使用,那么可以考虑把 A 类设计为 B 的内部类
,如果放到 p r i v a t e / p r o t e c t e d private/protected private/protected 位置,那么 A 类就是 B 类的专属内部类,其他地方都用不了
5、匿名对象
之前我们实例化对象不传参是这样的
int main()
{A aa1;//不能这样//因为分不清是实例化还是函数声明A aa2();return 0;
}
但是 C++ 还可以这样定义对象
int main()
{//传参A();//不传参A(1)return 0;
}
这样实例化出的是匿名对象,而我们之前定义的对象,叫做有名对象
- 匿名对象的
声明周期
只有当前这一行。一般临时定义一个对象当前用一下即可,就可以定义匿名对象
class Solution {
public:int Sum_Solution(int n) {//...return n;}
};
int main()
{Solution aa1;cout << aa1.Sum_Solution(10) << endl;cout << Solution().Sum_Solution(10) << endl;return 0;
}
如:想调用 S u m Sum Sum S o l u t i o n Solution Solution 函数,但 S u m Sum Sum S o l u t i o n Solution Solution 是成员函数,因此正常来讲应定义一个有名对象,才能调用。但难免有些繁琐,毕竟这里定义对象仅仅是为了调用 S u m Sum Sum_ S o l u t i o n Solution Solution 函数。这时,我们就可以使用匿名对象
,这样就方便多了。
简单来理解,匿名对象没有其他的,就是为了更方便
一点
但是,对匿名对象进行引用可以延长
匿名对象的生命周期
int main()
{//匿名对象是常性,用const引用const Solution& a = Solution();return 0;
}
6、对象拷贝时的编译器优化
- 现代编译器为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传参过程中可以省略的拷贝
- 如何优化 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;
};
6.1、情况一:类型转换
int main()
{A aa1 = 1; return 0;
}
从语法上来说,上述代码会发生隐式类型转换
。
先用 1 构造
一个临时对象 A类;再调用拷贝构造
,将临时对象赋值给 a a 1 aa1 aa1
运行结果:
可以看到,经过编译器的优化,实际运行结果只有构造
,并没有调用拷贝构造。
因为编译器认为构造一个临时对象,马上进行拷贝,中间的临时对象什么都没做,太浪费效率。因此省略了中间的临时对象
,直接构造 a a 1 aa1 aa1。
但下面这种情况就无法省略临时对象
int main()
{//引用的是构造的临时对象const A& aa2 = 1;return 0;
}
6.2、情况二:传值传参
void f1(A aa)
{}int main()
{A aa1(1);f1(aa1);return 0;
}
我们知道,对自定义类型,传值传参要先调用其拷贝构造
,那上述代码有发生优化吗?
没有,因为构造与拷贝构造并没有发生在一个连续的步骤中
,所以编译器并没有选择优化
那如果我使用匿名对象
呢?
void f1(A aa)
{}int main()
{f1(A(1));return 0;
}
这样构造和拷贝构造就是在一个连续的表达式的调用里面了
运行结果:
按语法逻辑来说,应该是先调用构造函数
构造匿名对象,再传值传参调用拷贝构造
现在,经过译器的优化,直接合二为一,只剩下构造
。
注:调用析构函数是在出函数作用域调的,不是程序结束。虽然过程合二为一,但它还是局部变量。
int main()
{f1(1);return 0;
}
这也是同理。
6.3、情况三:传值返回
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;}void Print(){cout << "A::Print->" << _a1 << endl;}private:int _a1 = 1;
};
从语法上来说,传值返回会先将返回值拷贝到一个临时对象中
,再将临时对象拷贝
给函数外接收的变量
那么经过编译器优化又会是什么结果呢?
A f2()
{A aa(1);return aa;
}
int main()
{f2().Print();return 0;
}
这里我没有选择接收,而是用产生的临时对象取调用 P r i n t Print Print 函数
VS2019 运行结果:
在VS2019中:先构造
生成 a a aa aa ,后调用拷贝构造
产生临时对象。此时出函数作用域, a a aa aa 生命周期结束,调用析构函数析构 a a aa aa。临时对象调用 P r i n t Print Print 函数后,生命周期结束(临时对象声明周期只在当前行),调用析构函数。
VS2022运行结果:
可以看到,VS2022的优化是比较激进的。
那他是没有生成临时对象还是没有生成 a a aa aa 呢?严格来说是没有生成 a a aa aa 只生成了临时对象
。为什么呢?我们可以看到析构函数的调用是在 P r i n t Print Print 函数之后,此时已经出了函数作用域了。
编译器优化这么“激进”不怕出 b u g bug bug 吗?
我们重载一个 ++,再看它优不优化
//前置++重载
//A& operator++()
//{
// ++_a1;
// return *this;
//}A f2()
{A aa(1);++aa;//加1,看你还优不优化return aa;
}
int main()
{f2().Print();return 0;
}
可以看到,优化还是这么激进,可结果居然是对的
。
只能说确实牛。
那如果我选择接收呢?
A f2()
{A aa(1);++aa;return aa;
}
int main()
{A ret = f2();ret.Print();return 0;
}
运行结果:
现在不仅仅是省略掉了 a a aa aa,连临时对象都省略掉了,合三为一。直接将结果算好,再用 2 去构造 r e t ret ret,连 ++ 都考虑了。
不过这是 VS2022 太强了,一般的编译器走:构造->拷贝构造->拷贝构造
或者 构造->拷贝构造
才是正常的。即不优化和优化一级是正常的,像 VS2022 这种优化两级的只能说变态。
好啦,本期关于类和对象的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!
相关文章:

【C++】—— 类与对象(五)
【C】—— 类与对象(五) 1、类型转换1.1、类型转换介绍1.2、类型转换的应用1.3、explicit 关键字 2、static 静态成员2.1、static 静态成员变量2.2、static 静态成员函数2.3、总结 3、友元3.1、友元函数3.2、友元类 4.内部类5、匿名对象6、对象拷贝时的编…...

scp命令的使用
在Windows和Linux之间传文件,最简单的是共享目录,如果不能使用共享目录,可以使用scp命令, 一般Windows和Linux都支持。 scp命令是secure copy的缩写,用于在Linux下进行远程文件拷贝,windows一般也有该命令…...

定位和解决线上接口性能优化或者数据库性能优化的思路是什么?
定位和解决线上接口性能优化或数据库性能优化问题是一项复杂且系统性的工作,需要综合运用监控、分析、调优等手段。以下是一个详细的思路,帮助您从定位问题到解决问题,确保系统的高效运行。 一、定位接口性能问题 1.1 监控和日志 1.1.1 监…...

修改docker的/var/lib/docker/overlay2储存路径
目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…...

解决中国式报表难题,这款工具真的免费且好用
一、概述 报表,对于任何企业或组织来说都不陌生。它将复杂的数据信息以简洁明了的方式展现出来,帮助决策者快速理解数据背后的趋势和问题。无论是财务报表、销售报表,还是库存报表,都是日常工作中不可或缺的部分。然而࿰…...

图解Kafka | 彻底弄明白 Kafka 两个最重要的配置
我已经使用 Kafka 近两年了,我发现有两个配置很重要,但是不太容易理解。这两个配置分别是acks和min.insync.replicas。 本文将通过一些插图来帮助理解这2个配置,以便更好的使用Kafka为我们服务。 复制 我假设你已经熟悉 Kafka了 ÿ…...

创建线程的三种方式
创建线程的三种方式 1. Thread 匿名内部类 Slf4j public class CreateThread {public static void main(String[] args) {Thread t1 new Thread("t1") {Overridepublic void run() {log.info("hello world");}};t1.start();} }2.定义 Runable public s…...

官宣|Apache Flink 1.20 发布公告
作者:郭伟杰(阿里云), 范瑞(Shopee) Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.20.0。与往常一样,这是一个充实的版本,包含了广泛的改进和新功能。总共有 142 人为此版本做出了贡献,…...

HarmonyOS应用一之登录页面案例
目录: 1、代码示例2、代码分析3、注解分析 1、代码示例 实现效果: /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance w…...

KubeSphere 部署 Kafka 集群实战指南
本文档将详细阐述如何利用 Helm 这一强大的工具,快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库…...

手把手教你安装音乐制作软件FL Studio 24.1.1.4285中文破解版
在当今数字化时代,音乐创作不再局限于传统的乐器和录音室,而是借助先进的音乐制作软件,如FL Studio,实现了前所未有的便捷与高效。FL Studio,以其强大的功能、直观的界面和丰富的插件资源,成为了众多音乐制…...

SDL 与 OpenGL 的关系
OpenGL 和 SDL 是两个不同的库,但它们可以配合使用来创建图形应用程序。 SDL(Simple DirectMedia Layer) SDL 是一个跨平台的多媒体库,用于处理图形、声音、输入和其他游戏开发所需的功能。它简化了窗口创建、事件处理和图形上下…...

考研数学 线性代数----行列式与矩阵
核心框架 前置知识 正式内容 知识点1:单位矩阵 知识点2:可逆矩阵 知识点3: |A|与可逆 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识…...

Golang实现简单的HTTP服务,响应RESTful请求判断形状大小
题目要求: 题目 1.shape 接口有面积Area() float64和 周长Perimeter()fioat64 两个法。为Circle Rectangle实现shape 接口。 2.实现isGreater(shape1,shape2 shape)boo1 函数,用于比较两个形状的大小,并使用单元测试验证 3.实现http.Handle…...

使用C语言构建Lua库
Lua 本身是用 C 语言编写的,因此使用 C 编写扩展可以更好地与 Lua 引擎集成,减少性能瓶颈,同时C 语言提供了对底层硬件和操作系统功能的直接访问能力,让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非…...

愤怒的江小白,这几年怎么了?
近日,东方甄选和江小白的纠纷引发了广泛关注。 8月8日晚间,东方甄选直播间中,主播天权在带货某款白酒产品时突然对比点评江小白产品,称江小白“不是白酒”:“你现在去看江小白的包装,上面是没有‘白酒’这…...

Unity教程(十)Tile Palette搭建平台关卡
Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...

如何防止员工私自拷贝公司内部文件?安企神帮你解决泄密之忧
在企业运营中,保护公司的机密信息至关重要。员工私自拷贝公司内部文件不仅可能导致商业秘密泄露,还可能损害公司的声誉和经济利益。下面我们将介绍一些有效的方法来防止这种情况的发生,并以“安企神”软件为例进行详细说明。 1. 明确规章制度…...

Linux应急响应检查工具
最近一直在优化的 linux 应急检查脚本,也是我一直在应急使用的工具 https://github.com/sun977/linuxcheckshoot 脚本包含两个检查工具,详情可看 README 或者 Banner linuxGun.sh 和 linuxcheck.sh 区别 1、linuxcheck.sh 是完整的 linux 系统检查脚本,…...

CP AUTOSAR标准之EEPROMAbstraction(AUTOSAR_SWS_EEPROMAbstraction)(更新中……)
1 简介和功能概述 EEPROM抽象层的功能、API和配置(见图1)。 图1:内存硬件抽象层模块概览 EEPROM抽象(EA)从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方案和分段以及“几乎”无限数量的擦除周期。 3 相关文献 3.1 输入文件 [1]基础软件模块列表AUTO…...

重启redis服务时报错:Failed to start redis.service: Unit not found
重启redis服务时报错:Failed to start redis.service: Unit not found redis配合安全修改了bind和auth配置,重启的时候报错了,试了很多方法,最后才通过日志解决了 1 重新加载systemd 配置并启动: sudo systemctl da…...

Hive3:识别内部表、外部表及相互转换
一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值,我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…...

Android笔试面试题AI答之Kotlin(7)
文章目录 29.简述Kotlin 中的内联类,什么时候需要内联类?内联类的特点何时需要内联类示例注意 30. 什么是 Coroutine Scope,它与 Coroutine Context 有什么不同?Coroutine Scope(协程作用域)Coroutine Cont…...

高辐照整车太阳辐照模拟系统试验舱
概览 高辐照整车太阳辐照模拟系统试验是一种模拟太阳辐照对汽车及其零部件影响的测试方法,主要用于评估汽车在长期日照条件下的性能和可靠性。该试验通常遵循特定的标准,如GB/T 2423.24-1995、DIN 75220、BMW PR306等,旨在模拟自然环境中的太…...

如何制作优秀的年终总结PPT?
制作优秀的年终总结PPT,是每位职场人士在年底时的一项重要任务。 一个优秀的年终总结PPT不仅能够清晰地展示你过去一年的工作成果,还能让领导对你的工作能力和态度留下深刻印象。 下面,我将从几个方面详细讲解如何制作这样的PPT,…...

架构师第六周作业
目录 1.部署3节点mongodb复制集。 1.1 安装mongodb 1.2 部署复制集 2.部署3节点Kafka集群 1.部署3节点mongodb复制集。 1.1 安装mongodb MongoDB安装包下载 下载地址:https://www.mongodb.com/try/download/community 版本根据需求选择,Mongodb6.…...

解密Java中介者模式:代码实例带你深入理解
1. 引言:中介者模式的重要性 在软件设计的世界里,模块间的相互依赖往往会导致系统的复杂性和维护难度的增加。中介者模式(Mediator Pattern)作为一种行为设计模式,它的出现就是为了解决这一问题。通过引入一个中介者对…...

19c做好这件事,大幅提升Data Pump工作效率
老司机遇到的新问题 expdp是Oracle 10g引入的数据导出工具,能够提供并行、压缩及元数据导出等更多的功能,在后续的版本中逐渐替代了传统的数据导出工具exp,是数据库开发运维常用的工具之一。在我的印象中,这个工具除了诸如大量的…...

6种常用的AR跟踪方法
增强现实 (AR) 是一项令人着迷的技术,可将虚拟内容与现实世界无缝集成。实现这种无缝集成的关键组件之一是跟踪。各种类型的跟踪用于确定 AR 内容在环境中的准确位置和方向。本文介绍 AR 最常见的6种跟踪方法。 NSDT工具推荐: Three.js AI纹理开发包 - Y…...

HBO引爆血腥浪漫,尺度全开必看的影视剧推荐
一直以来我们的僵尸题材电影风靡全国,同时西方也创作出吸血鬼题材、丧尸题材的影视剧也是层出不穷,那今天我们就来探讨下吸血鬼题材的影视剧。 吸血鬼题材的影视剧,一直以来都是观众的宠儿。从光鲜亮丽的《暮光之城》到狗血多角恋的《吸血鬼日…...