C++ primer 第五版 第三部分 部分习题答案(暂停更新....)

来源:互联网 发布:传奇手游被动技能 数据 编辑:程序博客网 时间:2024/05/16 15:05

13.1

就是新建一个同类型的对象,并且用引用的对象来初始化新对象的值。不希望改变原对象的值,但是又需要用到并且会修改这些值得时候使用拷贝。


13.2

因为它的拷贝构造函数里面用的不是引用,这样当它调用拷贝构造函数的时候,永远得不到实参。


13.4

全部都是拷贝。


13.5 13.8

class HasPtr{public:HasPtr(const std::string &s = std::string()) :ps(new std::string(s)), i(0){}HasPtr(const HasPtr&);HasPtr& operator=(const HasPtr&);protected:private:std::string *ps;int i;};HasPtr::HasPtr(const HasPtr& orig) :ps(new string(*(orig.ps))), i(orig.i){}HasPtr& HasPtr::operator=(const HasPtr &rhs){ps = new string(*(rhs.ps));i = rhs.i;}

13.13

#include <cstdlib>#include <iostream>#include <string>#include <vector>using namespace std;struct MyStruct{MyStruct(){ cout << "MyStruct()" << endl; }MyStruct(const MyStruct&){ cout << "MyStruct(const MyStruct&)" << endl; }};void test1(MyStruct & m){}void test2(MyStruct m){}int main(int argc, char *argv[]){MyStruct m;MyStruct c = m;cout << "1:" << endl;test1(m);cout << "1.1:" << endl;test2(m);cout << "2:" << endl;auto p = new MyStruct();cout << "3:" << endl;vector<MyStruct> v;v.push_back(m);system("PAUSE");return 0;}



13.14

输出都一样的值,因为除了a之外,其他的对象都是调用的合成拷贝构造函数。

13.15

当然会,理由参见13.14.

13.16

不会因为调用的是引用都不走构造函数了。参见13.13结果。


13.18

#include <cstdlib>#include <iostream>#include <string>#include <vector>using namespace std;struct Employee{Employee(string n);Employee(const Employee&) = default;void printName();string name;static int num;};int Employee::num = 0;void Employee::printName(){cout << name << endl;}Employee::Employee(string n) :name(n){this->num++;cout << name <<"'s Number is "<< num << endl;}/*Employee::Employee(const Employee& e) : name(e.name){cout << "&" << name << "'s Number is " << num << endl;}*/int main(int argc, char *argv[]){Employee a("hello"), b = a;cout << &a <<"##"<< &b << endl;b.name = "cccc";a.printName(); b.printName();system("PAUSE");return 0;}

13.19

需要定义拷贝控制成员,因为每次拷贝,雇员的编号都要重新生成一次。


13.22

同13.5.


13.23

HasPtr和书上代码有差异,书上代码更完美,我的代码有很多缺陷。

13.29

不会导致递归,因为HasPtr的swap内部,调用的是,string和int的swap而不是自身的swap。




0 0