1. 程式人生 > >C++類和物件知識點整理1

C++類和物件知識點整理1

第1題:請寫出下面這個類的方法程式碼

#include<iostream>
#include<string>
using namespace std;
#pragma warning (disable:4996)
//第1題:
class String
{
public:
	String( char *pstr)  
	{
		cout << "String::String()" << endl;
		if (pstr != NULL)
		{
			_pstr = new char[strlen(pstr) + 1];
			strcpy(_pstr, pstr);
		}
		else
		{
			_pstr = new char[1]();
		}
	}
	~String()   //解構函式
	{
		cout << "String::~String()" << endl;
		delete[] _pstr;
		_pstr = NULL;
	}
	String(const String &src)
	{
		cout << "String::String(const String &src)" << endl;
		_pstr = new char[strlen(src._pstr) + 1];
		strcpy(_pstr, src._pstr);
	}
	void Show()
	{
		cout << _pstr << endl;
	}
	void operator=(const String &src)
	{
		if (this != &src)
		{
			delete _pstr;
			_pstr = new char[strlen(src._pstr) + 1];
			strcpy(_pstr, src._pstr);
		}
		
	}
private:
	char *_pstr;
};

第2題:請完成下面這個類的方法程式碼,請實現帶頭結點的單鏈表

class Link
{
public:
	Link()    //建構函式
	{
		_phead = new Node();
	}
	~Link()   //解構函式
	{
		Node* pCur = _phead;
		Node* pNext = pCur;
		while (pCur != NULL)
		{
			pNext = pCur->_pnext;  //pNext指向剩下的連結串列
			delete pCur;     //釋放當前節點
			pCur = pNext;    
		}
		_phead = NULL;
	}
	void InsertHead(int val)
	{
		Node* pnewnode = new Node(val);
		pnewnode->_pnext = _phead->_pnext;
		_phead->_pnext = pnewnode;
	}
	void InsertTail(int val)
	{
		Node* pCur = _phead;
		for (; pCur->_pnext != NULL; pCur = pCur->_pnext)
		{
		}
		Node* pnewnode = new Node(val);  //指標域已經置空
		pCur->_pnext = pnewnode;
	}
	void DeleteNode(int val)  //刪除值為val的結點
	{
		Node* pCur = _phead;
		while (pCur->_pnext != NULL)
		{
			if (pCur->_pnext->_data == val)
			{
				Node * p = pCur->_pnext;
				pCur->_pnext = p->_pnext;
				delete p;
			}
			if (pCur->_pnext->_data != val)
			{
				pCur = pCur->_pnext;
			}
		}
	}
	void ShowLink()
	{
		for (Node* pCur = _phead->_pnext; pCur != NULL; pCur = pCur->_pnext)
		{
			cout << pCur->_data << " ";
		}
		cout << endl;
	}
private:
	class Node
	{
		Node(int data = 0) :_data(data), _pnext(NULL) {}
		int _data;//資料域
		Node* _pnext;//指標域
		friend class Link;
	};
	Node* _phead;   //頭指標
};

第3題:請給出下面物件建立過程中涉及的方法列印

class Test
{
public:
	Test(int a = 5, int b = 5) :ma(a), mb(b)
	{
		cout << "Test(int, int)" << endl;
	}
	~Test()
	{
		cout << "~Test()" << endl;
	}
	Test(const Test &src) :ma(src.ma), mb(src.mb)
	{
		cout << "Test(const Test&)" << endl;
	}
	void operator=(const Test &src)
	{
		ma = src.ma; mb = src.mb; cout << "operator=" << endl;
	}
private:
	int ma;
	int mb;
};

Test t1(10, 10);
int main()
{
Test t2(20, 20);
	Test t3 = t2;
	static Test t4 = Test(30, 30);
	t2 = Test(40, 40);
	t2 = (Test)(50, 50);
	t2 = 60;
	Test *p1 = new Test(70, 70);
	Test *p2 = new Test[2];
	Test *p3 = &Test(80, 80);
	Test &p4 = Test(90, 90);
	delete p1;
	delete[]p2;

	return 0;
}
Test t5(100, 100);

 

序號

輸出結果

對應指令

生成物件性質

生存週期

解釋說明

1

Test(int, int)

Test t1(10, 10);

全域性物件t1

程式結束前

t1的建構函式

2

Test(int, int)

Test t5(100, 100);

全域性物件t5

程式結束前

t5的建構函式

3

Test(int, int)

Test t2(20, 20);

區域性物件t2

物件所在函式結束後

t2的建構函式

4

Test(const Test&)

Test t3 = t2;

區域性物件t3

物件所在函式結束後

t3=t2時的拷貝建構函式

5

Test(int, int)

staticTest t4 = Test(30, 30);

靜態區域性物件t4

程式結束前

t4的建構函式

6

Test(int, int)

t2 =Test(40, 40);

臨時物件1

當前語句結束

臨時物件1的建構函式

operator=

賦值運算子過載

~Test()

臨時物件1的解構函式

7

Test(int, int)

t2 = (Test(50, 50);

臨時物件2

當前語句結束

臨時物件2的建構函式

operator=

賦值運算子過載

~Test()

臨時物件2的解構函式

8

Test(int, int)

t2 = 60;

臨時物件3(隱式)

當前語句結束

臨時物件3的建構函式

operator=

賦值運算子過載

~Test()

臨時物件3的解構函式

9

Test(int, int)

Test *p1 = newTest(70, 70);

p1指向的區域性物件(堆)

物件所在函式結束前(手動)

p1指向物件的建構函式

10

Test(int, int)

Test *p2 = newTest[2];

p2指向的區域性物件陣列(堆)

物件所在函式結束前(手動)

p2指向物件陣列[0]的建構函式

11

Test(int, int)

物件所在函式結束前(手動)

p2指向物件陣列[1]的建構函式

12

Test(int, int)

 

Test *p3 = &Test(80, 80);

p3指向的臨時物件(棧)

當前語句結束

p3指向物件的建構函式

~Test()

 

p3指向物件的解構函式

13

Test(int, int)

 

Test &p4 = Test(90, 90);

p4引用的臨時物件(棧)

物件所在函式結束後

p4引用的臨時物件(棧)建構函式

 

~Test()

 

delete p1;

 

 

p1指向物件的建構函式

 

~Test()

 

delete[]p2;

 

 

p2指向物件陣列[0]的解構函式

 

~Test()

 

 

 

p2指向物件陣列[1]的解構函式

 

~Test()

 

 

 

 

p4引用的臨時物件(棧)建構函式

 

~Test()

 

 

 

 

t3的解構函式

 

~Test()

 

 

 

 

t2的解構函式

 

~Test()

 

 

 

 

t4的解構函式

 

~Test()

 

 

 

 

t5的解構函式

 

~Test()

 

 

 

 

t1的解構函式