1. 程式人生 > >C++面向物件(基礎)

C++面向物件(基礎)

1.建構函式

用例例項化物件的時候呼叫的成員方法:
建構函式沒有返回值,函式名與類名同名,引數沒有規定(根據需要)
例項化物件的時候必須呼叫建構函式
一旦自己內有實現建構函式,編譯器就會為我們自動預設生成一個建構函式
預設的建構函式就是沒有引數的建構函式

示例如下:

class Person
{
private:
	char *_name;
	bool _sex;
	int _age;

public:
	//建構函式  函式名必須和類名同名
	Person(const char *name, bool sex, int age)
	{
		cout << "Person(const char *name, bool sex, int age)" << endl;
		_name = new char[strlen(name) + 1];
		strcpy_s(_name, strlen(name) + 1, name);
		_sex = sex;
		_age = age;
	}
	Person()   //系統預設自動生成沒有引數的函式
	{
		_name = NULL;
		cout << "Person()" << endl;
	}

}

2.this指標

this指標:指向物件的指標
在成員方法呼叫的時候預設傳入一個this指標
在成員方法申明/定義的地方,預設加上this指標引數
在成員方法中使用成員變數的地方加上this->

程式碼示例:

void eat(/*Person * const this*/)  //呼叫的時候預設傳入一個this指標
{
	//this = NULL;
	cout << this->_name << "::::eat" << endl;	
}

3.拷貝建構函式

拷貝建構函式:
用已存在的相同型別的物件去構造新物件
如果不是自己拷貝,編譯器則會自己預設生成一個拷貝建構函式
預設生成的拷貝建構函式只進行值的拷貝

程式碼示例如下:

Person(const Person& src)  //這裡必須加一個&,讓系統判定為傳入的引數是指標
	{
		cout << "Person(Person& src)" << endl;
		//防止淺拷貝
		_name = new char[strlen(src._name) + 1];
		strcpy_s(_name, strlen(src._name) + 1, src._name);
		_sex = src._sex;
		_age = src._age;
	}

4.等號運算子過載函式

等號運算子過載函式:
用一個已經存在的物件賦值給另一個已經存在的物件
如果自己不實現,則編譯器會自己預設生成一個淺拷貝的 =

注意:防止自賦值   防止記憶體洩漏   防止淺拷貝

程式碼示例如下:

Person& operator=(const Person& src)
	{
		cout << "=====" << endl;
		//防止自賦值
		if (this == &src)
		{
			return *this;
		}

		//防止記憶體洩漏
		if (NULL != _name)
			delete[]_name;

		//防止淺拷貝
		_name = new char[strlen(src._name) + 1];
		strcpy_s(_name, strlen(src._name) + 1, src._name);
		_sex = src._sex;
		_age = src._age;

		return *this;
	}

5.解構函式

在物件生命週期終止的時候,自動呼叫的成員方法
如果不自己定義解構函式,編譯器就會自己生成解構函式

程式碼示例如下:

~Person()
	{
		cout << "~Person()" << endl;
		delete []_name;
		_name = NULL;
	}

備註:class的訪問屬性預設為private

          struct的訪問屬性為預設public