1. 重载指针访问符 初体验
#include <iostream>
using namespace std;
class test {
public:
test(int input) :num(input), j(input) {}
~test() {}
int operator * () const {
return this->get();
}
int get() const {
// j++;
// 编译报错
//类的成员函数后面加const,
//表明这个函数不会对这个类对象的数据成员作任何改变。
return num;
}
private:
int num; //变量为private,利用成员函数get调用
int j;
};
int main() {
test a(3);
cout << a.operator*() << endl;
cout << *a << endl; //重载*操作符
return 0;
}
2.智能指针 初体验
#include <iostream> using namespace std; class Test { private: int i; public: int j; Test(int i); ~Test(); }; Test::Test(int i) { cout << "Test(int i)" << endl; this->i = i; this->j = i; } Test::~Test() { cout << "~Test()" << endl; } class Point { private: Test* pTest; public: Test* operator->(); Test& operator*(); Point(Test* p); ~Point(); }; Point::Point(Test* p) { pTest = p; } Point::~Point() { delete pTest; } Test* Point::operator -> () { cout << "Test* Point::operator -> ()" << endl; return pTest; } Test& Point::operator *() { cout << "Test& Point::operator *()" << endl; return *pTest; } int main() { Point p1 = new Test(1101); 本质是通过下面这种方式来调用一个成员函数,获取到函数返回值,进而访问公有属性的j元素: cout << "data j : " << p1.operator->()->j << endl << endl; 编译器为我们做了简化,我们可以直接使用符合原生语义的指针访问符号->,来访问: cout << "data j : " << p1->j << endl; 本质是通过下面这种方式来调用对应的成员函数,进而访问公有属性的j元素: cout << "data j : " << p1.operator*().j << endl; 编译器为我们做了简化,因此也可以通过*指针访问符的原生方式来调用上述成员函数: cout << "data j : " << (*p1).j << endl; return 0; }
智能指针一句话概念释义: 智能指针类对象在其生命周期结束后会自动释放所指向且涉及到的相关所有堆内存。
智能指针三板斧:
1. 在仅带一个参数的构造函数内对智能指针类内部的它类指针赋值,使其指向外部的它类对象。
2. 使用成员函数的方式重载指针访问->操作符(返回值为智能指针内部的它类指针) 和
*操作符(返回值为智能指针内部的它类指针指向的它类对象)。
3. 在析构函数内delete它类指针(这就可以触发它类对象的析构函数被执行)。
按照上述已有的分析,我们现在或许可以写出令一个智能指针a指向一个智能指针b,再令b指向c…指来指去很多次,最后才指向实际的用户对象,这样的代码,
稍加思考,这必将成为日后bug的一个来源。
良好的编程经验要求: 一块堆内存最多只能由一个指针来标识。
这是非常重要的一点,
接下来我们继续实现的 拷贝构造函数和赋值操作符重载函数就被要求:
要完成指针指向内存所有权的转移(复制后,再delete原有的指针),而不是单纯复制。
3.智能指针类模板 待添加
.