gpt4 book ai didi

详解C++-(=)赋值操作符、智能指针编写

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解C++-(=)赋值操作符、智能指针编写由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

(=)赋值操作符 。

  • 编译器为每个类默认重载了(=)赋值操作符
  • 默认的(=)赋值操作符仅完成浅拷贝
  • 默认的赋值操作符和默认的拷贝构造函数有相同的存在意义

(=)赋值操作符注意事项 。

首先要判断两个操作数是否相等 。

返回值一定是 return *this; 返回类型是Type&型,避免连续使用=后,出现bug 。

比如

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test{
     int *p;
     Test( int i)
     {
        p= new int (i);
     }
     Test& operator = ( const Test& obj)
     {
        if ( this !=obj)
        {
            delete p;
            p= new int (*obj.p);
        }
        return * this ;
     }
};

编译器默认提供的类函数 。

包括了:构造函数,析构函数,拷贝构造函数, (=)赋值操作符 。

智能指针 。

智能指针的由来 。

在以前C程序里,使用malloc()等函数动态申请堆空间时,若不再需要的内存没有被及时释放,则会出现内存泄漏,若内存泄漏太多.

则会直接导致设备停止运行,特别是嵌入式设备,可能有些设备一上电就要运行好几个月. 。

在C++里,为了减少内存泄漏,所以便引出了智能指针 。

介绍 。

  • 智能指针实际上是将指针封装在一个类里,通过对象来管理指针.
  • 在构造函数时,通过对象将指针传递进来,指针可以是缺省值.
  • 然后构造“ -> ” “ * ” “ = ”等操作符重载,让这个对象拥有指针的特性.
  • 最后通过析构函数,来释放类里的指针.

注意 。

  • 智能指针只能指向堆空间中的对象或者变量
  • 并且一片空间最多只能由一个智能指针标识(因为多个指向地址相同的智能指针调用析构函数时,会出现bug)
  • ->和*都是一元操作符,也就是说不能带参数

比如ptr->value的->

当ptr的类型是普通指针类型时,等价于:(*ptr).mem 。

当ptr的类型是类时,等价于:(ptr.operator->())->value    等价于: ( *(ptr.operator->()) ).value 。

所以->操作符函数的返回类型是type*,返回值是一个指针变量本身(不带*) 。

接下来个示例,指向一个int型的智能指针 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
class Point{
     int *p;
public:
     Point(int *p=NULL)
     {
      this->p = p;
     }
     int* operator -> ()
     {
        return p;
     }
     int& operator *()
     {
        return *p;
     }
     ~Point()
     {
      cout<< "~Point()" <<endl;
      delete p;
     }
};
int main()
{   
     for (int i=0;i<5;i++)
     {
     Point p=new int(i);
     cout <<*p<<endl;
     }
     return 0;
}

运行打印

0 ~Point() 1 ~Point() 2 ~Point() 3 ~Point() ~Point() 。

从结果可以看到, Point p每被从新定义之前,便会自动调用析构函数来释放之前用过的内存,这样便避免了野指针的出现.

接下来,我们继续完善上面代码,使它能够被赋值. 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
using namespace std;
class Point{
     int *p;
public :
     Point( int *p=NULL)
     {
      this ->p = p;
     }
     bool isNULL()
     {
        return (p==NULL);
     }
     int * operator -> ()
     {
        return p;
     }
     int & operator *()
     {
        return *p;
     }
    Point& operator = ( const Point& t)
     {
        cout<< "operator =()" <<endl;
        if ( this !=&t)
        {
            delete p;
            p = t.p;
            const_cast <Point&>(t).p=NULL;
        }    
        return * this ;
     }
     ~Point()
     {
      cout<< "~Point()" <<endl;
      delete p;
     }
};
int main()
{   
     Point p= new int (2);
     Point p2;
     p2= p;     //等价于 p2.operator= (p);
     cout << "p=NULL:" <<p.isNULL()<<endl;
     *p2+=3;    //等价于 *(p2.operator *())=*(p2.operator *())+3;
             //p2.operator *()返回一个int指针,并不会调用Point类的=操作符
     cout << "*p2=" <<*p2 <<endl;
     return 0;
}

运行打印

operator =()       p=NULL:1              // Point  p的成员已被释放 *p2=5 ~Point() ~Point() 。

但是,还有个缺点,就是这个智能指针仅仅只能指向int类型,没办法指向其它类型. 。

总结 。

以上所述是小编给大家介绍的C++-(=)赋值操作符、智能指针编写,希望对大家有所帮助,如果大家有任何疑问请给我留 。

言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:https://www.cnblogs.com/lifexy/p/8658605.html 。

最后此篇关于详解C++-(=)赋值操作符、智能指针编写的文章就讲到这里了,如果你想了解更多关于详解C++-(=)赋值操作符、智能指针编写的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com