習題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
“因爲這兩個類中使用的是智能指針,因此在拷貝時,類的所有成員都將被拷貝,在銷燬時所有成員也將被銷燬。”