本文已参与「新人创作礼」活动,一起开启掘金创作之路。
C和C++中,->运算符和.运算符都与引用类、结构和共用体的成员有关。A.B意味着A是一个实体,是对象或者结构体,B是A的成员。A->B意味着A是一个指针,B是A的成员,提取A中的成员B。
//定义一个A类,整形m_B是A的成员,创建对象m_A
class A{
public:
int B:
}m_A;
//将实例m_A中,B的值赋m_B
int m_B=m_A.B;
A* p_A = &m_A;
m_B=m_A->B;//以指针形式,访问实例m_A
可见,一个变量后面可以跟 . 运算符,也可能跟->运算符。最近用写代码,发现在C++智能指针shared_ ptr后面,二者都可以跟,十分有趣。
C++智能指针是一个对象,是对普通指针进行的一层封装,本质上是一个对象,用来管理动态内存,有超越new和delete的良好特性。声明一个指向string的只能指针。
shared_ptr<string> p1;
p1后面可以是.运算符,说明p1是个对象实体,当使用.运算符的时候,是调用了智能指针类中的方法或成员,get()方法获得p1对象真正的地址。
string *p2=p1.get();//返回智能指针中真正的指针,即指向一个字符串的指针
shared_ptr类后面可以有->运算符,说明该实体有指针的功效,这是由于智能指针shared_ptr类重载了->运算符,该运算符返回。同时,*运算符执行解引用功能。
if(p1->empty()){//此时,empty是string的成员
*p1=“I love huihui”;
}
其原理如下:
#include <iostream>
#include <string>
using namespace std;
template<class T>
class m_ptr
{
public:
m_ptr(T* ptr = nullptr)
:_ptr(ptr)
{}
~m_ptr()
{
if (_ptr)
delete _ptr;
}
T& operator*()//*运算符返回一个类的引用
{
return *_ptr;
}
T* operator->()//->运算符返回所指向对象的指针
{
return _ptr;
}
private:
T* _ptr;
};
int main()
{
m_ptr<string> p1(new string);
*p1 = "";
cout << *p1 << endl;
if (p1->empty()) {//注意此处empty为string类的成员函数
cout << "i love huihui" << endl;
}
}