C++ Primer Plus 第十二章复习题答案

2021/4/24 12:28:17

本文主要是介绍C++ Primer Plus 第十二章复习题答案,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.

a.该构造函数没有将str指针初始化,应将指针初始化为NULL,或是使用new[]初始化。

b.该构造函数没有创建新的字符串,只是复制了原有字符串的地址。应当使用new[]和strcpy()。

c.该构造函数复制了字符串,但没有分配内存空间,应使用new char[len + 1]来分配适当数量的内存。

2.

(1)当这种类型的对象过期时,成员指针指向的数据仍将保留在内存空间中,同时不可访问,因为成员指针已经被销毁,这将造成内存泄漏。解决方法是,让析构函数delete构造函数中new分配的内存。

(2)一个对象默认初始化为另一个对象,将复制指针值,但不复制指向的数据,导致两个指针指向相同的内存,这将导致调用析构函数时释放两次内存。解决方法是,定义一个复制构造函数,使初始化复制指向的数据。

(3)将一个对象赋值给另一个对象也将导致两指针指向相同的数据。解决方法是,重载赋值运算符,使之复制数据,而不是指针。

3.C++自动提供下面的成员函数:

  默认构造函数,能够声明对象数组和未初始化的对象。

  默认析构函数,销毁对象和释放对象的指针成员指向的动态内存。

  复制构造函数,完成成员逐个赋值。

  赋值运算符,完成成员逐个赋值。

  地址运算符,返回调用对象的地址,即this指针的值。

4.改正后的代码如下

(1)固定字符数组版本

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 class nifty
 6 {
 7     private:
 8         char personality[40];
 9         int talents;
10 
11     public:
12         nifty();
13         nifty(const char* s);
14         friend ostream& operator <<(ostream& os, const nifty& n);
15 };
16 
17 nifty::nifty()
18 {
19     personality[0] = '\0';
20     talents = 0;
21 }
22 
23 nifty::nifty(const char* s)
24 {
25     strcpy_s(personality, strlen(personality), s);
26     talents = 0;
27 }
28 
29 ostream& operator <<(ostream& os, const nifty& n)
30 {
31     cout << n.personality << endl;
32     cout << n.talents << endl;
33 
34     return os;
35 }

 

(2)动态字符数组版本

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 class nifty
 6 {
 7     private:
 8         char* personality;
 9         int talents;
10 
11         //add
12         nifty(const nifty& n);
13         nifty& operator =(const nifty& n);
14 
15     public:
16         nifty();
17         nifty(const char* s);
18         
19         //add
20         ~nifty()
21         {
22             delete [] personality;
23         }
24 
25         friend ostream& operator <<(ostream& os, const nifty& n);
26 };
27 
28 nifty::nifty()
29 {
30     personality = NULL;
31     talents = 0;
32 }
33 
34 nifty::nifty(const char* s)
35 {
36     personality = new char[strlen(s) + 1];
37     strcpy(personality, s);
38     talents = 0;
39 }
40 
41 ostream& operator <<(ostream& os, const nifty& n)
42 {
43     cout << n.personality << endl;
44     cout << n.talents << endl;
45 
46     return os;
47 }

 

5.

a.

#1 Golfer();

#2 Golfer(const char* name, int g);

#3 Golfer(const char* name, int g);

#4 Golfer();

#5 Golfer(const Golfer& g); ,有些编译器接着调用默认赋值运算符函数

#6 Golfer(const char* name, int g); ,有些编译器接着调用默认赋值运算符函数

#7 默认赋值运算符函数

#8 先Golfer(const char* name, int g); 然后使用默认赋值运算符函数

 

b.

类需要定义一个复制数据、而不是复制地址的赋值运算符函数。



这篇关于C++ Primer Plus 第十二章复习题答案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程