1,关于赋值的疑问:
1,什么时候需要重载赋值操作符?
2,编译器是否提供默认的赋值操作符?
2,关于赋值的疑问:
1,编译器为每个类默认重载了赋值操作符;
1,意味着同类型的类对象可以相互赋值;
2,默认的赋值操作符仅完成浅拷贝;
3,当需要进行深拷贝时必须重载赋值操作符;
1,和拷贝构造函数相同;
4,赋值操作符与拷贝构造函数有相同的存在意义;
3,默认赋值操作符重载编程实验:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test 7 { 8 int* m_pointer; 9 public: 10 Test() 11 { 12 m_pointer = NULL; 13 } 14 Test(int i) 15 { 16 m_pointer = new int(i); 17 } 18 Test(const Test& obj) 19 { 20 m_pointer = new int(*obj.m_pointer); 21 } 22 Test& operator = (const Test& obj) 23 { 24 if( this != &obj ) // 避免自赋值; 25 { 26 delete m_pointer; 27 m_pointer = new int(*obj.m_pointer); 28 } 29 30 return *this; 31 } 32 void print() 33 { 34 cout << "m_pointer = " << hex << m_pointer << endl; 35 } 36 ~Test() 37 { 38 delete m_pointer; 39 } 40 }; 41 42 int main() 43 { 44 Test t1 = 1; 45 Test t2; 46 47 t2 = t1; // 默认赋值操作符的浅拷贝使得两个对象内部指针指向同一片空间; 48 49 int i = 0; // C 语言中允许这样,所以 C++ 中也必须允许; 50 i = i; 51 52 t2 = t2; // C++ 中也要允许自赋值,但是没有意义; 53 54 t1.print(); 55 t2.print(); 56 57 return 0; 58 }
2,输出结果:
m_pointer = 0x9387008
m_pointer = 0x9387018
3,赋值操作符重载注意事项:
1,赋值操作符返回值一定是引用,为了连续赋值;
2,参数类型一定是 const Type&;
3,不能自赋值;
4,返回当前对象;
4,关于赋值的疑问:
1,如果要进行深拷贝,拷贝构造函数和赋值操作符的实现都要自定义;
5,一般性原则:
1,重载赋值操作符,必然要实现深拷贝;
1,实现深拷贝和自定义赋值操作符及拷贝构造函数是充要条件;
6,数组类的优化编程实验:
1,IntArray.h 文件:
1 #ifndef _INTARRAY_H_ 2 #define _INTARRAY_H_ 3 4 class IntArray 5 { 6 private: 7 int m_length; 8 int* m_pointer; 9 10 IntArray(int len); 11 IntArray(const IntArray& obj); 12 bool construct(); 13 public: 14 static IntArray* NewInstance(int length); 15 int length(); 16 bool get(int index, int& value); 17 bool set(int index ,int value); 18 int& operator [] (int index); 19 IntArray& operator = (const IntArray& obj); 20 IntArray& self(); 21 ~IntArray(); 22 };
2,首先写出赋值操作符注意事项模板:
1 IntArray& IntArray::operator = (cosnt IntArray& obj) 2 { 3 if( this != &obj ) 4 { 5 6 } 7 8 return *this; 9 }
3,函数实现:
1 IntArray& IntArray::operator = (const IntArray& obj) 2 { 3 if( this != &obj ) 4 { 5 int* pointer = new int[obj.m_length]; 6 7 if( pointer ) 8 { 9 /* 复制参数对象中的元素 */ 10 for(int i=0; i<obj.m_length; i++) 11 { 12 pointer[i] = obj.m_pointer[i]; 13 } 14 15 /* 深拷贝 */ 16 m_length = obj.m_length; 17 delete[] m_pointer; 18 m_pointer = pointer; 19 } 20 } 21 22 return *this; 23 }
4,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 #include "IntArray.h" 4 5 using namespace std; 6 7 int main() 8 { 9 IntArray* a = IntArray::NewInstance(5); 10 IntArray* b = IntArray::NewInstance(10); 11 12 if( a && b ) 13 {