C++筆記——防止混亂

類:

一、構造函數

初始化列表
形式:
class Stu{
public:
int a;
float b;
Stu() : a(12), f(12.3f){}
}
作用:1、可通過數值對數據成員初始化
2、可通過構造函數參數對數據成員進行初始化
3、可通過成員之間相互初始化
在構造函數之後,且順序無任何影響,只與聲明順序有關

1、數組的初始化列表使用
int a[4];
Stu() : a(){}
此處可以將a[4]全部初始化爲0,但是注意只有VS可以這樣做。
2、結構體的初始化列表
與普通元素類似,直接定義一個結構體之後,可以用它給相同的結構體直接進行賦值。
3、引用的初始化列表使用
錯誤示範:
class Stu{
public:
int a;
int& b;
Stu(int c) : a(b), b©{}
}
注意,參數c用完就會釋放,所以b的值是不確定的,無效的。
class Stu{
public:
int a;
int& b;
Stu(int& c) : a(b), b©{}
}
4、const的初始化列表
class Stu{
public:
int a;
int& b;
const int e;
Stu(int& c) : a(b), b©, e©{}
}

二、析構函數

1、malloc free與new 和delete的區別
new 和delete會觸發構造和析構,而malloc和free不會。
測試代碼


#include<iostream>
using namespace std;
 
class Stu
{
public:
	Stu()
	{
		cout << "構造函數" ;
	}
	~Stu()
	{
		cout << "析構函數";
	}
};
int main()
{
	Stu stu;  //觸發構造和析構
	Stu * b = new Stu ;		//觸發構造
	delete b;			//觸發析構
	return 0;
}

三、const和靜態成員static

const
形式:void fun() const {};
注意:構造函數和析構函數絕對不可以是常函數
可以使用常函數外數據成員但是不可以修改,常函數內部的不做限制
this指針變更爲const 類名*
常對象:const 修飾的對象
常對象只能調用常函數,不能調用普通函數。

static
形式 static int a;
static void fun(){}
注意:static修飾的成員,在構造之前就存在。且所有對象共有。
靜態成員類外初始化, int 類名::a = 18;
靜態常量整型數據成員可以直接進行初始化:static const int a = 13.12f;其它類型不可以

四、拷貝構造

形式:Stu(const Stu&) 參數是本類的常引用
1、新建一個對象,並將其初始化爲同類現有對象
Stu a1(a) || Stu a2 = a || Stu* a4 = new Stu(a)均會調用拷貝構造函數
2、程序生成對象副本時,
函數參數傳遞對象的值 || 函數返回對象

深拷貝:淺拷貝會出現重複釋放空間的問題
指針成員不能直接賦值,要用內存拷貝,memcpy,strcpyd等(拷貝構造中)

5、類之間
class AClass
{
public:
int a;
AClass(int n) :a(n){}
};
class BClass
{
public:
int b;
AClass aObj;
BClass(int m): aObj(m){
b = aObj.a;
}
BClass(const BClass& C) :aObj(b){
b = C.b;
aObj.a = C.aObj.a;
}
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章