标签:对象 operator ++ har class char* 定义 prime str
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.
类需要定义一个复制数据、而不是复制地址的赋值运算符函数。
标签:对象 operator ++ har class char* 定义 prime str
原文地址:https://www.cnblogs.com/aPaulWong/p/14696180.html