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的建構函式 |
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的解構函式 |