怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
// 平常可能遇到一个问题
class Test
{
public:
Test() {
cout << "默认构造函数被调用了" << endl;
}
~Test() {
cout << "析构函数被调用了" << endl;
}
public:
int m_Age;
};
void test01()
{
Test t1; // 此时调用了系统默认的构造函数和析构函数
Test* t2 = new Test; // 在堆区new一个对象,此时只会调用默认构造函数! 不会调用析构函数
delete t2; // 只有在delete后才会调用析构函数 // 问题:如果 new 和 delete 中间代码量特别大,有的人就极可能忘记delete
// 解决:使用智能指针去托管析构函数的调用
}
****************************************************************************************
// 智能指针 SmartPoint
class Person
{
public:
Person() {
this->m_Age = 18; // 默认构造函数 对年龄初始化
}
void showAge(){
cout << "Age= " << this->m_Age << endl; // 查看年龄的成员函数
}
public:
int m_Age;
};---------------------------------------------------------------------------------------------------
// 创建智能指针类:维护 new 出来的 Person*class SmartPoint
{
public: // 解决自动delete问题
SmartPoint(Person* person) // 参数是通过 new Person 得到的
{
this->person = person; // 有参构造函数作用:初始化,用于接收 new 出来的 Person *
}
~SmartPoint() // 实例化了SmartPoint对象, 就意味着会调用析构函数, 那么就意味着会自动delete
{
// 释放掉堆区对象
if (this->person != NULL)
{
delete this->person;
this->person = NULL;
}
}
public: // 解决 和 * 重载问题
// 指针 运算符的重载 // 传入的是 person (Person* person = new Person)
Person* operator->()
{
return this->person;
}
// 解引用 * 运算符重载 // 传入的是 person (Person* person = new Person)
Person& operator*()
{
return *person;
}---------------------------------------------------------------------------------------------------
public:
Person* person; // 维护一个new出来的对象指针
};
****************************************************************************************
void test02()
{
SmartPoint sp(new Person); // 调用SmartPoint的有参构造, 本质是new的一个Person类的指针: person /*
说明:
正常: Person* p = new Person // p 是指针,用法 p->
采用指针指针维护, SmartPoint sp(new Person) // sp是类,用法 sp.
需求: sp指针化 // sp.的操作 变为 sp-> // 也可以解引用在化为类
解决:指针运算符的重载( 2方面: sp.的操作 变为 sp-> 以及 *(sp))
*/
sp->showAge(); // 注意, sp->返回值为指针,其实应该写成sp->->showAge(), 但系统做了优化
(*sp).showAge(); // sp已经指针化, *sp还原成类,使用.操作
}
怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针相关推荐
- C++知识点34——动态内存与智能指针
一.动态内存 动态内存所在的位置在堆区,由程序员手动分配并手动释放,而不像栈内存由系统分配和自动释放 C++通过new运算符为对象在堆上分配内存空间并返回该对象的地址,并用delete运算符销毁对象并 ...
- c++string 加引号_C++|引用计数与shared_ptr智能指针(以实现String类为例)
C++ 中,动态内存的管理是通过一对运算符来完成的,new 用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针.delete接收一个动态对象的指针,调用对象的析构函数销毁对象,释放与之 ...
- 怎么new一个指针_【译】Rust与智能指针
原文链接:https://dev.to/imaculate3/that-s-so-rusty-smart-pointers-245l 原文标题:That's so Rusty!: Smart poin ...
- c++ 指针_C/C++学习笔记——C提高:指针强化
指针是一种数据类型 指针变量 指针是一种数据类型,占用内存空间,用来保存内存地址. void test01(){ int* p1 = 0x1234; int*** p2 = 0x1111; print ...
- python 指针_C++的动态内存:C++的指针
在C++里,指针(pointer)变量被用来存储内存地址.C++要求使用特定的类型来定义指针.这个类型被用来指示需要如何去解释内存地址里的数据.我们已经知道,在计算机的内部,内存存储的是1和0,而C+ ...
- C++ 在一个类中用指针的形式申请堆内存构造出另一个类并访问私有成员变量(包括智能指针版本)
一.普通指针版本 代码 #include<iostream> using namespace std;class A {public:A(){ax=2;cout<<" ...
- C++ 智能指针 :内存泄漏、 RAII、智能指针、auto_ptr、unique_ptr、shared_ptr、weak_ptr、定制删除器deleter
文章目录 内存泄漏 什么是内存泄漏 内存泄漏的危害: 如何避免内存泄漏 RAII 智能指针 auto_ptr unique_ptr shared_ptr 循环引用问题 weak_ptr 定制删除器 内 ...
- android 指针是什么意思,Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...
提供引用计数器的类RefBase我们就暂时介绍到这里,后面我们再结合智能指针类一起分析,现在先来看看强指针类和弱指针类的定义.强指针类的定义我们在前面介绍轻量级指针的时候已经见到了,就是sp类了,这里 ...
- c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...
我目前正在尝试调用sqlite3库函数,它希望我传递一个sqlite3 **. 这是我目前的代码.我有一个工作部分,一部分给我一个错误: sqlite3 *sqlite = m_db.get(); i ...
最新文章
- 显示-连接-删除管理数据库管理应用
- HDOJ 2049 不容易系列之(4)——考新郎
- 扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎扎心了
- php实现附件上传下载,PHP实现文件上传与下载
- html自动执行的事件,js自执行事件
- 封装出现 用户.计算机,ES4封装WIN7出现[Administrator.计算机名]目录的可能解决方案...
- Mac Pro m1 安装 brew/eclipse/visual stadio code/nodejs/git
- 7-138 打印沙漏 (20 分)
- python--django基础篇(创建项目,模型类,迁移,测试数据库操作)
- AMOS问卷数据建模前传【SPSS 052期】
- c语言头文件和函数库,C语言的头文件和库文件(函数库)
- SPSS中的数据分析—描述性统计分析【3】
- 2010总结,2011展望
- 【SMAP 土壤水分的质量处理】
- 移动端苹果安卓卓适配
- KALI attack 实验室
- DDR3的学习笔记(一)
- 算法第四版扔鸡蛋问题
- 【湍流】基于kolmogorov结合次谐波补偿的方法生成大气湍流相位屏附matlab代码
- 你还在疯狂加班打码?兄dei,不如跟我学做超融合吧!