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);}