第十三章 習題13-11-習題13-20

習題13-11

動態對象要用delete銷燬

	~HasPtr()
	{
		delete ps;
	}

習題13-12

“當指向一個對象的引用或指針離開作用域時,析構函數不會執行”

三次;

這裏由於執行的是拷貝初始化,不是拷貝賦值,而拷貝初始化的時候是引用傳遞,所以不會有函數傳遞產生的臨時對象。

習題13-13

#include<iostream>
#include<vector>
using namespace std;
struct X {
	X() { cout << " X()" << endl; }
	X(const X&z) {  cout << "X(const X&)" << endl; }
	X &operator=(const X&z) {  cout << " X &operator=(const X&)" << endl; return *this; }
	~X() { cout << "~X()" << endl; }

};
void main()
{
	X X1;              //輸出X()
	X X2(X1);          //輸出X(const X&)
	X X3=X1;           //輸出X(const X&)  拷貝初始化
	X X4;              //輸出X()
	X4 = X1;           // X &operator=(const X&)拷貝賦值運算    
	vector<X> vec;
	vec.push_back(X1);       //輸出X(const X&)  拷貝初始化,對函數push_back實參傳遞給形參   
	X *x = new X(X1);        //輸出X(const X&)  拷貝初始化,對動態內存初始化函數傳實參;    
	delete x;
}             
 銷燬對象X1,X2,X3,X4,容器被銷燬時執行析構函數,動態內存指針依靠delete析構;參見P445“什麼時候會調用析構函數”

輸出爲:
 X()
X(const X&)
X(const X&)
 X()
 X &operator=(const X&)
X(const X&)
X(const X&)
~X()
~X()
~X()
~X()
~X()
~X()

習題13-14

輸出3個完全一樣的數,因爲合成的拷貝構造函數會將每一個數據成員拷貝。

習題13-15

會,因爲拷貝構造函數會阻止直接拷貝a中數據成員,而由拷貝構造函數控制怎麼拷貝數據成員,即生成一個新的序號;新的結果是會輸出3個不一樣的數,並且這3個數不是abc中的數,因爲在b、c初始化,以及實參a,b,c傳遞給形參的時候都發生了拷貝初始化;

習題13-16

會改變輸出結果,因爲a、b、c在調用函數f的時候,不使用拷貝初始化,所以最後的三個數就是a、b、c中的數;

習題13-17

#include <iostream>
using namespace std;
int sa = 10;
class numbered
{
public:
	numbered(){ mysn = sa++;}
	int mysn;
};
void f(numbered s)
{
	cout << s.mysn << endl;
}
void main()
{
	numbered a, b = a, c = b;
	f(a);
	f(b);
	f(c);
}
輸出爲 10,10,10;


#include <iostream>
using namespace std;
int sa = 10;
class numbered
{
public:
	numbered(){ mysn = sa++;}
	numbered(const numbered & s) { mysn = sa++; }
	numbered &operator=(const numbered&s) { mysn =sa++; return *this; }
	int mysn;
};
void f(numbered s)
{
	cout << s.mysn << endl;
}
void main()
{
	numbered a, b = a, c = b;
	f(a);
	f(b);
	f(c);
}
輸出爲:13,14,15

#include <iostream>
using namespace std;
int sa = 10;
class numbered
{
public:
	numbered(){ mysn = sa++;}
	numbered(const numbered & s) { mysn = sa++; }
	numbered &operator=(const numbered&s) { mysn =sa++; return *this; }
	int mysn;
};
void f(numbered &s)
{
	cout << s.mysn << endl;
}
void main()
{
	numbered a, b = a, c = b;
	f(a);
	f(b);
	f(c);
}
輸出爲:10,11,12;

習題13-18

struct Employee
{
	string name;
	int id;
	Employee() { id = s_id++; };
	Employee(string s) :name(s) { id = s_id++; };
	static int s_id;
};
int Employee::s_id = 0;

習題13-19

不需要,因爲id不一樣,

	Employee(const Employee&) = delete;
	Employee &operator=(const Employee&) = delete;

習題13-20

“因爲這兩個類中使用的是智能指針,因此在拷貝時,類的所有成員都將被拷貝,在銷燬時所有成員也將被銷燬。”

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