黑馬程式設計師匠心之作-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++結構體
- 黑馬程式設計師程式設計師
- 黑馬程式設計師-Java概述程式設計師Java
- 黑馬程式設計師Java培訓和Android培訓:物件導向程式設計師JavaAndroid物件
- 黑馬程式設計師前端學習之路程式設計師前端
- 黑馬程式設計師——型別轉換程式設計師型別
- 物件的初始化和清理物件
- 黑馬程式設計師——物件導向(上)— 類、物件、封裝、繼承、構造方法程式設計師物件封裝繼承構造方法
- 黑馬程式設計師第七天程式設計師
- 黑馬程式設計師——Java高新技術---反射程式設計師Java反射
- 黑馬程式設計師Java培訓和Android培訓:程式設計基礎程式設計師JavaAndroid
- 黑馬程式設計師_Java高新技術之列舉程式設計師Java
- 黑馬程式設計師Java培訓和Android培訓:列舉程式設計師JavaAndroid
- 黑馬程式設計師Java培訓和Android培訓:I/O程式設計師JavaAndroid
- 黑馬程式設計師Java培訓和Android培訓_IO(二)程式設計師JavaAndroid
- 黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”程式設計師Java筆記
- 黑馬程式設計師java筆記之一-----Map集合程式設計師Java筆記
- 黑馬程式設計師Java培訓和Android培訓:培訓前奏程式設計師JavaAndroid
- 黑馬程式設計師Java培訓和Android培訓:內部類程式設計師JavaAndroid
- 【黑馬程式設計師濟南中心】代理模式-Cglib代理程式設計師模式CGLib
- 【黑馬程式設計師濟南中心】java基礎-陣列程式設計師Java陣列
- 黑馬程式設計師面試題一(交通燈管理系統)程式設計師面試題
- 黑馬程式設計師---學習筆記3:進位制程式設計師筆記
- 黑馬程式設計師—一張帖看完黑馬所有學科、班級就業薪資貼程式設計師就業
- 黑馬程式設計師Java培訓和Android培訓:多執行緒程式設計師JavaAndroid執行緒
- 黑馬程式設計師Java培訓和Android培訓Java技術二程式設計師JavaAndroid
- 程式設計師的燈下黑:“逗到底”的程式設計師程式設計師
- 黑馬程式設計師_ios基礎總結1_IOS概述程式設計師iOS
- 黑馬程式設計師--java高新技術 25--列舉,反射程式設計師Java反射
- 黑馬程式設計師Java培訓和Android培訓_java高新技術(一)程式設計師JavaAndroid
- 程式設計師【黑話】指南程式設計師
- 黑馬程式設計師Android實戰影片教程等,超過30程式設計師Android
- 黑馬程式設計師——Java學習筆記之⑧——“Java新技術”程式設計師Java筆記
- 【原始碼分享】讓黑馬程式設計師逆襲的仿騰訊 IM 專案原始碼程式設計師
- Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入Python程式設計
- 黑馬程式設計師:PHP為何能成最搶手後端語言?程式設計師PHP後端
- 黑馬程式設計師_畢向東JAVA基礎_設計模式&異常處理機制程式設計師Java設計模式
- 橙單,歷經磨鍊後的匠心之作