C++_day06_运算符重载_智能指针

1.只有函数运算符可以带缺省函数,其他运算符函数主要由操作符个数确定

2.解引用运算符和指针运算符

示例代码:

 

#include <iostream>
using namespace std;

class A{
public:
   A(int data = 0):m_data(data)
  {
    cout << "A构造" << endl;
  }

  ~A(void)
  {
    cout << "A析构" << endl;
  }int m_data;

private:

};

class PA{
public:
    PA (A* pa = NULL):m_pa(pa){}
 

   ~PA(void)
   {
     if(m_pa)
      {
      delete m_pa;
      m_pa = NULL;
      }
    }


    A& operator*(void) const
    {
        return *m_pa;
    }
    A* operator->(void) const
    {
        return &**this;  //this是指向对象pa的指针,*this是pa,**this是复用上面解引用的运算符。
    }

private:
    A* m_pa;
    
};

int main(void)
{
    /*
    A* pa = new A(1234);
    (*pa).m_data = 5678;
    cout << pa->m_data << endl;
    delete pa;
    */
    PA pa(new A(1234));
    (*pa).m_data = 5678;
    //pa.operator*().m_data = 5678;
    cout << (*pa).m_data << endl;
    cout << pa->m_data << endl;
    //cout << pa.operator->()->m_data << endl;
    
    return 0;
}

3.智能指针无需手动释放

#include <iostream>
#include <memory>

using namespace std;

class Student{
public:
    Student (string const& name, int age):m_name(name), m_age(age)
    {
        cout << "Student构造" << endl;
    }
    ~Student(void)
    {
        cout << "Student析构" << endl;
    }
    string m_name;
    int m_age;
};

void foo(void)
{
    auto_ptr<Student> ps(new Student("张无忌", 25));
    cout << (*ps).m_name << ", " << ps->m_age << endl;
}

int main(void)
{
    for(int i = 0; i < 3; i++)
        foo();
    return 0;
}

运行结果:

 智能指针其实是做指针的转移,

1.智能指针没有复制语义,只有转移语义。

2.不能用智能指针管理对象数组。

 

posted @ 2019-04-04 14:20  鸿蒙过客  阅读(325)  评论(0编辑  收藏  举报