bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

c++基礎-類與對象2-創新互聯

類與對象
  • 4.2 對象的初始化和清理
    • 4.2.1 構造函數和析構函數
    • 4.2.2 構造函數的分類及調用
      • 兩種分類方式:
      • 三種調用方式:
    • 4.2.3 拷貝構造函數調用時機
    • 4.2.4 構造函數調用規則
    • 4.2.5 深拷貝與淺拷貝
    • 4.2.6 初始化列表
    • 4.2.7 類對象作為類成員
    • 4.2.8靜態成員
      • 靜態成員變量
      • 靜態成員函數

c++面向對象的三大特性為:封裝、繼承、多態
c++認為萬事萬物皆為對象,對象上有其屬性和行為

為通許等地區用戶提供了全套網頁設計制作服務,及通許網站建設行業解決方案。主營業務為成都做網站、網站設計、通許網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!4.2 對象的初始化和清理 4.2.1 構造函數和析構函數

對象的初始化和清理也是兩個非常重要的安全問題
一個對象或者變量沒有初始狀態,對其使用后果是未知
同樣的使用完一個對象或變量,沒有及時清理,也會造成一定的安全問題
c++利用了構造函數和析構函數解決上述問題,這兩個函數將會被編譯器自動調用,完成對象初始化和清理工作。對象的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和西溝,編譯器會提供。編譯器提供的構造函數和析構函數是空實現

  • 構造函數: 主要作用在于創建對象時為對象的成員屬性賦值,構造函數有編譯器自動調用,無需手動調用。
  • 析構函數: 主要作用在于對象銷毀前系統自動調用,執行一些清理工作。

構造函數語法:類名(){}
(需在public作用域調用)

  1. 構造函數,沒有返回值也不寫void
  2. 函數名稱與類名相同
  3. 構造函數可以有參數,因此可以發生重載
  4. 程序在調用對象時候會自動調用構造,無需手動調用,而且只會調用一次

析構函數語法:~類名(){}

  1. 析構函數,沒有返回值也不寫void
  2. 函數名稱與類名相同,在名稱前加上符號~
  3. 構造函數不可以有參數,因此不可以發生重載
  4. 程序在對象銷毀前會自動調用析構,無需手動調用,而且只會調用一次
#includeusing namespace std;
//對象的初始化和清理
//1、構造函數 進行初始化操作
class Person{public:
	Person(){cout<<"Person構造函數的調用"<cout<<"Person析構函數的調用"<Person p1;//棧上的數據,自動釋放
}
int main(){test01();
	cout<<"~~~~~~分隔符~~~~~~"<
4.2.2 構造函數的分類及調用 兩種分類方式:
  • 按參數分類:有參構造和無參構造
  • 按類型分類:普通構造和拷貝構造
class Person{public:
	//普通構造函數
	Person(){//無參構造(編譯器默認構造)
		cout<<"Person的無參構造函數調用"<//有參構造
	age=a;
		cout<<"Person的有參構造函數調用"<//將傳入的人身上所有的屬性,拷貝到我身上
		age=p.age;
		cout<<"Person的拷貝構造函數調用"<
三種調用方式:
  • 括號法(注:調用無參構造函數時不要加())
Person p1;//無參構造
	Person p2(10);//有參構造
	Person p3(p1);//拷貝構造
	Person p4(p2);//拷貝構造
	cout<<"p2的年齡:"<
  • 顯示法
Person p1;
	Person p2=Person(10);//有參構造
	Person p3=Person(p2);//拷貝構造
	Person(10);//稱為匿名對象 特點:當前行執行結束后,系統會立即回收掉匿名對象
  	Person(p3);//注意:不要利用拷貝構造函數初始化匿名對象
  	//編譯器認為Person(p3)==Person p3;	重定義
  • 隱式轉換法
Person p1=10;//相當于Person p1=Person(10);
	Person p2=p1;//拷貝構造
4.2.3 拷貝構造函數調用時機

c++中拷貝構造函數調用時機通常有三種情況

  • 使用一個已經創建完畢的對象來初始化一個新對象
void test1(){Person p1(20);
	Person p2(p1);
	cout<<"p2的年齡:"<
  • 值傳遞的方式給函數參數傳值
void test2_1(Person p){}
void test2(){Person p;
	test2_1(p);
}
  • 以值方式返回局部對象
Person test3_1(){Person p1;
	cout<<(int*)&p1<Person p=test3_1();
	cout<<(int*)&p<
4.2.4 構造函數調用規則

默認情況下,c++編譯器至少給一個類添加3個函數

  1. 默認構造函數(無參,函數體為空)
  2. 默認析構函數(無參,函數體為空)
  3. 默認拷貝函數,對屬性進行值拷貝

構造函數調用規則:

  • 如果用戶定義有參構造函數,c++不再提供默認無參構造,但會提供默認拷貝構造
  • 如果用戶定義拷貝構造函數,c++不再提其他構造函數
int main(){Person p;
	p.a=18;
	Person p2(p);
	cout<<"p2的年齡:"<
//三個函數均自定義
//若注釋掉無參構造,保留有參構造,則運行Person p,顯示沒有合適的構造函數可用
//若只保留自定義拷貝構造,則有參無參構造函數均無
class Person{public:
	int a;
	Person(){cout<<"無參構造函數調用"<a=age;
		cout<<"有參構造函數調用"<cout<<"拷貝構造函數調用"<cout<<"析構函數調用"<
4.2.5 深拷貝與淺拷貝

淺拷貝:簡單的賦值拷貝操作(淺拷貝帶來的問題是堆區重復釋放)
深拷貝:在堆區重新申請空間,進行拷貝操作

淺拷貝時完全值復制,存在兩個相同地址,會通過析構函數釋放兩次,第二次為非法操作
淺拷貝

#includeusing namespace std;
class Person{public:
	Person(int age,int height){m_Age=age;
		m_Height=new int(height);
		cout<<"有參構造函數調用"<cout<<"拷貝構造函數的調用"<if(m_Height!=NULL){	delete m_Height;
			m_Height=NULL;
		}
		cout<<"析構函數調用"<Person p1(18,160);
	cout<<"p1的年齡為"<
4.2.6 初始化列表

作用: c++提供了初始化列表語法,用來初始化屬性
語法:構造函數():屬性1(值1),屬性2(值2)...{}

#includeusing namespace std;
class Person{public:
		int m_A;
		int m_B;
		int m_C;
		//傳統初始化操作
//			m_A=a;
//					m_B=b;
//					m_C=c;
//				}Person(int a,int b,int c){//初始化列表初始化屬性
		Person(int a,int b,int c):m_A(a),m_B(b),m_C(c){}
};
int main(){Person p(10,20,30);
	cout<<"m_A="<	cout<<"Phone的析構"<public:
		Person(string name,string pName):m_Name(name),m_Phone(pName){	cout<<"Person的構造"<	cout<<"Person的析構"<Person p("張三","蘋果max");
	cout<
4.2.8靜態成員

靜態成員就是在成員變量和成員函數前加上關鍵詞static,成為靜態成員
靜態成員分為:

靜態成員變量
  • 所有對象共享同一份數據
  • 在編譯階段分配內存
  • 類內聲明,類外初始化

1、類內聲明,類外初始化
2、靜態成員變量有訪問權限

class Person{public:
		static int m_A;
	private:
		static int m_B;//私有 類外不可訪問
};
int Person::m_A=100;

3、靜態成員變量 不屬于某個對象上,所有對象都共享一份數據

void test1(){Person p;
	cout<

4、靜態成員變量的兩種訪問方式
1、通過對象進行訪問
2、通過類名進行訪問

void test2(){Person p;
	//通過對象進行訪問
	cout<
靜態成員函數
  • 所有對象共享同一個函數
  • 靜態成員函數只能訪問靜態成員變量

1、靜態成員函數有訪問權限
2、靜態成員函數只能訪問靜態成員變量

class Person{public:
	static void func(){m_A=100;    //靜態成員函數可以訪問靜態成員變量
//		m_B=200;	//靜態成員函數不可以訪問非靜態成員變量
		cout<<"static void func調用"<//類外不可訪問私有靜態成員函數
		cout<<"static void func2調用"<

3、兩種訪問方式

void test1(){//通過對象訪問
	Person p;
	p.func();
	//通過類名訪問
	Person::func();
}

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

文章標題:c++基礎-類與對象2-創新互聯
分享鏈接:http://vcdvsql.cn/article48/pgjhp.html

成都網站建設公司_創新互聯,為您提供網站改版網站營銷全網營銷推廣商城網站企業網站制作靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯