设为首页 加入收藏

TOP

C++中的赋值操作符重载和拷贝构造函数(一)
2019-05-23 18:07:59 】 浏览:122
Tags:操作 重载 拷贝 构造 函数

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     {
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[NOI2002] 贪吃的九头蛇 下一篇C++ 随机数

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目