C++ 快速回顾(二)
C++ 快速回顾(二)
- 前言
- 一、友元类
- 二、友元函数
- 三、深浅拷贝
- 浅拷贝
- 深拷贝
前言
用于快速回顾之前遗漏或者补充C++知识
一、友元类
友元的优点是可以快速的轻松的访问的原本由于私有保护的字段和函数,同时这也是它的缺点这样破坏了原本封装性。
如下代码是不能直接访问ClassA 中的私有和保护函数的
class ClassA
{
private:void Test01() {printf("Test01\r\n");}
protected:void Test02() {printf("Test02\r\n");}
public:void Test03() {printf("Test03\r\n");}
};class ClassB
{
public:void TestFunc(ClassA& Value){//Value.Test01();//Value.Test02();Value.Test03();}
};int main()
{ClassA A;ClassB B;B.TestFunc(A);system("pause");return 0;
}
要想访问需要加上friend class xxx
class ClassA
{friend class ClassB;
private:void Test01() {printf("Test01\r\n");}
protected:void Test02() {printf("Test02\r\n");}
public:void Test03() {printf("Test03\r\n");}
};
二、友元函数
使用全局函数调用ClassA中的私有变量a 是没有办法进行直接访问的
class ClassA
{
private:int a;
};void Test02(ClassA& Value)
{//Value.a = 100;
}int main()
{ClassA A;Test02(A);system("pause");return 0;
}
需要使用友元函数进行访问,需要注意友元函数不是某个对象的函数,不属于任何对象
class ClassA
{
public:friend void Test01(ClassA& Value);
private:int a;
};void Test01(ClassA& Value)
{Value.a = 100;
}void Test02(ClassA& Value)
{//Value.a = 100;
}int main()
{ClassA A;Test01(A);Test02(A);system("pause");return 0;
}
三、深浅拷贝
浅拷贝
只对值进行拷贝赋值
默认不写拷贝构造就是浅拷贝,只会对值进行拷贝赋值
如下对拷贝进行了复写,什么也不做只打印一个hello,一共会执行两次拷贝构造下面代码
ClassTest B = A; 会执行一次
ClassTest C(A);也会执行一次
只是对象的值一样但是实际的地址不同
class ClassTest
{
public:ClassTest(int Value1, int Value2):a(Value1),b(Value2){}ClassTest(const ClassTest& Value) {printf("Hello");}
private:int a = 0;int b = 0;
};int main()
{ClassTest A(1,2);auto a = &A;ClassTest B = A;auto b = &B;ClassTest C(A);system("pause");return 0;
}
深拷贝
面对如下案例,由于浅拷贝导致被释放了两次导致崩溃,如何解决就是使用深拷贝
class ClassPtr
{
public:ClassPtr(int Value1, int Value2):a(Value1), b(Value2){}public:int a;int b;
};class ClassTest
{
public:ClassTest(int Value1, int Value2):a(Value1),b(Value2){Ptr = new ClassPtr(100, 200);}//ClassTest(const ClassTest& Value) {//}~ClassTest(){if (Ptr){printf("~ClassTest\r\n");delete Ptr;Ptr = nullptr;}}
public:int a = 0;int b = 0;ClassPtr* Ptr;
};int main()
{{ClassTest A(1, 2);ClassTest B = A;}system("pause");return 0;
}
深拷贝修改如下
ClassTest(const ClassTest& Value) {this->a = Value.a;this->b = Value.b;this->Ptr = new ClassPtr(Value.Ptr->a, Value.Ptr->b);}