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 第十二章复习题答案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享