黑馬程式設計師匠心之作-4.2物件的初始化和清理
目錄:
4.2.1建構函式和解構函式
4.2.2建構函式的分類和呼叫
#include <iostream>
#include<string>
#include<ctime>
using namespace std;
class Person
{
//建構函式分類:有參構造 無參構造
// 普通構造 拷貝構造
public:
Person()
{
cout << "呼叫無參建構函式" << endl;
}
Person(int a)
{
age = a;
cout << "呼叫有參建構函式" << endl;
}
//拷貝建構函式
Person(const Person& P)
{
//將傳入的person的屬性拷貝到目前的person的屬性裡面;
age = P.age;
cout << "呼叫拷貝建構函式" << endl;
}
~Person()
{
cout << "呼叫解構函式" << endl;
}
int age;
};
void test()
{
//呼叫方法
//括號法
Person P1;//預設呼叫方法;
//注意事項:在使用預設呼叫方法時,不能加(),編譯器會預設是函式的宣告
//Person p1();//錯誤寫法,認為是一個返回值為Person型別,函式名為p1的函式宣告;相當於void t1();
Person P2(10);//有參構造
Person P3(P2);//拷貝構造
cout << "P2年齡:" << P2.age << endl;
cout << "P3年齡:" << P3.age << endl;
//顯示法
Person P4 = Person(10);//顯示呼叫有參構造
//Person(10);//匿名物件,特點,當前行結束之後系統會自動收回匿名物件;
//注意事項:不要用拷貝構造初始化匿名物件
//Person(P3);//編譯器認為Person(P3)相當於Person P3,與之前的命名相同
Person P5 = Person(P4);//顯示呼叫拷貝構造
//隱士轉換法
Person P6 = 10;//相當於 Person P5 = Person(10);
Person P7 = P6;
}
int main()
{
test();
system("pause");
return 0;
}
4.2.3何時呼叫拷貝函式
#include <iostream>
#include<string>
#include<ctime>
using namespace std;
class Person
{
//建構函式分類:有參構造 無參構造
// 普通構造 拷貝構造
public:
Person()
{
cout << "呼叫無參建構函式" << endl;
}
Person(int a)
{
age = a;
cout << "呼叫有參建構函式" << endl;
}
//拷貝建構函式
Person(const Person& P)
{
//將傳入的person的屬性拷貝到目前的person的屬性裡面;
age = P.age;
cout << "呼叫拷貝建構函式" << endl;
}
~Person()
{
cout << "呼叫解構函式" << endl;
}
int age;
};
void test01()//使用一個建立完畢的物件初始化另外一個新的物件
{
Person P1;//預設呼叫方法;
Person P2(P1);//拷貝構造
}
void diaoyong(Person p)
{
}
void test02()//值傳遞的方式給函式引數傳值
{
Person p;
diaoyong(p);
}
Person work()
{
Person p;
return p;
}
void test03()//以值方式返回區域性物件
{
Person P = work();
}
int main()
{
test01();
test02();
test03();
system("pause");
return 0;
}
4.2.4建構函式呼叫規則
4.2.5深拷貝與淺拷貝
重點:
1、淺拷貝:編譯器提供的等號複製;會產生堆區資料重複釋放問題
深拷貝:自己重新開闢堆區進行值得傳遞;解決淺拷貝問題
2、解構函式程式碼可以用來釋放堆區資料。
淺拷貝帶來的問題:堆區的資料重複釋放,棧區資料特點,現金後出,P2先釋放掉了地址為0x0011這個地址的資料,P1再來釋放的時候,出現了堆區地址重複釋放的問題。
#include <iostream>
#include<string>
#include<ctime>
using namespace std;
class Person
{
public:
Person()
{
cout << "呼叫無參建構函式" << endl;
}
Person(int a,int height)
{
age = a;
m_height = new int(height);
cout << "呼叫有參建構函式" << endl;
}
//拷貝建構函式
Person(const Person& P)
{
//將傳入的person的屬性拷貝到目前的person的屬性裡面;
age = P.age;
// m_height = P.m_height;//淺拷貝操作:編譯器自帶的拷貝函式寫法,會產生堆區重複釋放的問題,
//深拷貝操作:自己開闢一個新的堆區進行身高的值傳遞
m_height = new int(*P.m_height);
cout << "呼叫拷貝建構函式" << endl;
}
~Person()
{
//析構程式碼,將堆區開闢的資料釋放
if (m_height != NULL)
{
delete m_height;
m_height = NULL;
}
cout << "呼叫解構函式" << endl;
}
int age;
int* m_height;
};
void test01()
{
Person P1(18,167);
cout << "P1的年齡:" << P1.age << " P1的身高:" << *P1.m_height << endl;
Person P2(P1);//拷貝構造
cout << "P2的年齡:" << P2.age << " P2的身高:" << *P2.m_height << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
4.2.6初始化列表
#include <iostream>
#include<string>
#include<ctime>
using namespace std;
//傳統的初始化方法
//class Person
//{
//
//public:
//
//
// Person(int a,int b)
// {
// m_a = a;
// m_b = b;
// }
//
// int m_a;
// int m_b;
//};
//列表初始化方法;
class Person
{
public:
Person(int a, int b):m_a(a),m_b(b)
{
}
int m_a;
int m_b;
};
void test01()
{
Person P1(18,167);
cout << "a:" << P1.m_a<< " b:" << P1.m_b << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
4.2.7類物件作為類成員
4.2.8靜態成員
#include <iostream>
#include<string>
#include<ctime>
using namespace std;
class Person
{
public:
//靜態成員函式
static void func()
{
a = 100;//靜態成員函式可以訪問靜態成員變數,靜態成員a是共享的不屬於某一個物件
//b = 200;//錯誤,靜態成員函式不能訪問靜態成員變數。非靜態成員b不是共享的,
cout << "static void 呼叫" << endl;
}
static int a;
//int b;
private://靜態成員函式同樣有訪問許可權;若設定為私有,則類外仍然不能訪問到;
static void func2()
{
}
};
int Person::a = 100;
void test01()
{
//靜態成員函式的兩種訪問方式
//1通過物件訪問
Person P;
P.func();
//通過類名訪問
Person::func();
}
int main()
{
test01();
system("pause");
return 0;
}
相關文章
- 黑馬程式設計師匠心之作|C++教程從0到1入門程式設計--結構體定義和使用程式設計師C++結構體
- 黑馬程式設計師程式設計師
- 物件的初始化和清理物件
- 黑馬程式設計師前端學習之路程式設計師前端
- 黑馬程式設計師第七天程式設計師
- 【黑馬程式設計師濟南中心】代理模式-Cglib代理程式設計師模式CGLib
- 【黑馬程式設計師濟南中心】java基礎-陣列程式設計師Java陣列
- Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入Python程式設計
- 程式設計師【黑話】指南程式設計師
- 2019黑馬程式設計師vue.js專案實戰全套程式設計師Vue.js
- 黑馬程式設計師Android實戰影片教程等,超過30程式設計師Android
- 程式設計師需要了解的硬核知識之作業系統和應用程式設計師作業系統
- 黑馬程式設計師Linux系統開發視訊之VIM使用教程程式設計師Linux
- 程式設計師到底是幹什麼的?請不要再黑程式設計師了程式設計師
- 為什麼大多程式設計師黑php不黑python?程式設計師PHPPython
- 普通程式設計師和厲害程式設計師的差距!程式設計師
- 不黑程式設計師會死星人程式設計師
- 誰再黑程式設計師我就打誰程式設計師
- 一個天才程式設計師的黑幫大佬人生程式設計師
- 【黑馬程式設計師西安中心】激動!剛剛人事給我發offer了.......程式設計師
- 橙單,歷經磨鍊後的匠心之作
- 好程式設計師分享JavaScript建立物件的方式!程式設計師JavaScript物件
- 好程式設計師web前端分享css初始化程式碼程式設計師Web前端CSS
- 程式設計師自黑的梗!產品經理:功能實現起來很簡單!—程式設計師:*&%程式設計師
- 物件導向程式設計和`GP`泛型程式設計物件程式設計泛型
- 好程式設計師前端教程-javascript的物件導向程式設計師前端JavaScript物件
- 非科班程式設計師和科班程式設計師的差距到底在哪裡?程式設計師
- 以前的程式設計師,現在的程式設計師程式設計師
- 細數程式設計師被躺著中槍的各種黑程式設計師
- 網際網路程式設計師行話(黑話)合集程式設計師
- 5年匠心之作,雲原生安全真經大公開!
- 10 Python物件導向程式設計:類和物件以及和Java的對比Python物件程式設計Java
- 程式設計師程式設計入門,物件導向需要知道這6點!程式設計師物件
- 美工和程式設計師的職業病程式設計師
- 程式設計師的黑磚窯,東南亞博彩騙局詳解程式設計師
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師分享JavaScript之-文件物件模型(DOM)程式設計師JavaScript物件模型