HOUR 11 Developing Advanced Pointers
Creadting Objects on the Heap + Deleting Objects
假定定义好了一个Cat类,在Heap上创建Cat的语法为:
Cat *pPointer = new Cat;
此语句调用默认构造函数对其进行实例化。
原理:当delete一个指向heap上的object的指针时候,在内存释放之前,将自动调用析构函数。
class SimpleCat {public:SimpleCat();~SimpleCat();int getAge() const {return itsAge;} private:int itsAge; };
new出来的类如何访问其成员数据?
考虑上面的这个类,如果使用语句在heap上定义一个object:
SimpleCat *pPointer = new SimpleCat;
如果我们要调用getAge()函数,怎么使用呢?
(*pPointer).getAge();
是不是有点麻烦呢?这里的括号确保反引用在访问getAge()之前发生。所以C++提供了更简单的方法,让我们完成对堆上的物体的数据访问。这个运算符就是 ->运算符。
pPointer -> getAge();
使用这个运算符就舒服多了!
Member Data on the Heap
就是一个类的数据成员在构造函数或其他函数中allocate,在析构函数中delete。
熟练下面这个例子,一定牢记,有了new 一定有delete
#include <QCoreApplication>
#include <iostream>
using namespace std;class SimpleCat
{public:SimpleCat();~SimpleCat();int getAge() const {return *itsAge;}void setAge(int age) { *itsAge = age;}int getWeight() const {return *itsWeight;}void setWeight(int weight) const {*itsWeight = weight;}
private:int *itsAge;int *itsWeight;
};//It is a default constructor
//if there is no parameter
SimpleCat::SimpleCat()
{itsAge = new int(2);itsWeight = new int(5);
}SimpleCat::~SimpleCat()
{delete itsAge;delete itsWeight;//由于这是析构函数,所以没有必要为这两个指针赋值为nullptr,因为他们在此终结了已经
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);SimpleCat *Frisky = new SimpleCat;cout << "Frisky is " << Frisky->getAge() << " years old.\n";Frisky->setAge(5);cout << "Frisky is " << Frisky->getAge() << " years old.\n";delete Frisky;return a.exec();
}
注意到:
- 对类用户(main函数)来说,并不知道两个类的itsAge 和 itsWeight是指向heap上两个int变量的指针。
- 析构函数中的delete itsAge ; delete itsWeight;这是默认析构函数做不到的,假如不自己定义析构函数,执行了delete Frisky之后,两个指针 *itsAge *itsWeight也随之被删除,但是堆上对应的两块儿内存还在那里,这就必然造成内存泄漏。
this 指针
没什么说的,好像在运算符重载那里用的挺多的,而且只能用在类定义内部,因为用在外面谁知道你的这个this指的是谁,每个object都有一个隐藏的this指针,例如
return (this -> getAge());
const Pointer
- const int *pOne; 指针指向一个const的整型,不可以 *pOne = 3;
- int * const pTwo = new int i; 指针是是一个常指针,不可以 pTwo = &age;换句话说,这个指针只能指向heap中的i变量,不能再有别人了。
- const int * const pThree; 一个指向常变量的常指针,以上两个都不可以实现
const Pointer 和 const Function
一个指向const object 的指针,通过该指针只能调用该object内的const 函数,例如
#include <QCoreApplication>
#include <iostream>class Man
{
public:int getAge() {return age;} //int getAge() const {return age;}void setAge(int newAge) { age = newAge;};Man();~Man();
private:int age;
};
Man::Man()
{age = 8;
}
Man::~Man()
{}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);const Man *bell = new Man;int i = bell->getAge();// std::cout << bell->getAge() << std::endl; delete bell; bell = nullptr;return a.exec();
}
main函数中,涂黄语句定义了一个指向const对象的指针,红色语句通过该指针访问getAge()函数,此时编译器报错,
“int Man::getAge(void)”: 不能将“this”指针从“const Man”转换为“Man &”
刚刚说过了一个指向const对象的指针只能调用该对象中的const函数,看类定义中,getAge()我忘了写const了,绿色为正确定义方法。
我们还可以理解,如果一个对象被限定为const,那么它的隐藏this指针在使用时,只能通过this访问其const成员函数。
Summary
指针可以指向基本数据类型,也可以指向object;
object可以在heap上创建,方法是 Man *bell = new Man; new Man 实际上返回的是一个地址,所以左值必须定义指针才可以。
类的数据成员可以定义为指向heap的指针,创建在构造函数中创建: int *age = new int(2); 删除在析构函数中进行: delete age; 调用如 return (*age);
转载于:https://www.cnblogs.com/a-cock/p/8584046.html
HOUR 11 Developing Advanced Pointers相关推荐
- 【Learncpp中文翻译版】【1.9、1.10、1.11】
文章目录 1.9 - Introduction to literals and operators 文字 运算符 链接运算符 返回值和副作用 1.10 - Introduction to expres ...
- Data Types in the Kernel [LDD3 11]
为什么要单独讲kernel的数据结构? kernel是一个支持很多平台很多架构的OS,不同的架构上,很多的数据结构都是不同的,如何保证kernel能兼容多个架构,这就得益于kernel良好的数据结构设 ...
- 计算机编程课程顺序_您可以在6月开始参加630项免费的在线编程和计算机科学课程...
计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...
- 计算机编程课程顺序_620多个免费的在线编程和计算机科学课程,您可以在三月开始
计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...
- 计算机编程课程顺序_您可以在5月开始学习530项免费的在线编程和计算机科学课程
计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...
- 信息检索领域相关资料 (A Guide to Information Retrieval)
信息检索领域相关资料 (A Guide to Information Retrieval) Organized by Hongfei Yan Last updated on July 27, 2007 ...
- IT类英文电子书存档页面
为什么80%的码农都做不了架构师?>>> http://www.salttiger.com/archives/ 目前我主要在以下两个网站收集编程类的电子书,在这上面找不到的书, ...
- c++每调用一次函数+1_每个开发人员都应该知道的一些很棒的现代C ++功能
c++每调用一次函数+1 As a language, C++ has evolved a lot. 作为一种语言,C ++已经发展了很多. Of course this did not happen ...
- mit计算机33门课程_440多门免费在线编程和计算机科学课程,您可以在2月开始
mit计算机33门课程 Six years ago, universities like MIT and Stanford first opened up free online courses to ...
- 计算机编程课程顺序_470道免费的在线编程和计算机科学课程,四月开始
计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...
最新文章
- 【Qt】通过QtCreator源码学习Qt(七):插件管理类简介
- YOLO训练Pedestrain
- 数据中心冷热空气流控制优化方案
- 全球及中国抓紧器行业十四五发展态势及前景规划建议报告2021-2027年版
- php5.4与php5.2,升级php 5.2.14 到5.4.11版本报错问题
- POJ3335(判断多边形内核是否存在)
- cmd对应linux sleep命令,linux的sleep命令
- linux 初步学习
- lisp 计算三点的夹角_计算三点所形成的夹角的三种方法
- 雅虎的flickr相册Host解析
- valgrind内存泄露和线程竞态检测
- 《环太平洋》视觉特效分解
- Android 前置摄像头预览与编码
- 数组中的slice()方法和splice()
- JN5168的SPI使用
- 《小时代2青木时代》 短评 与郭敬明的中立评价
- 人物-商界-杨惠妍:杨惠妍
- QQ会员2018春节红包抵扣券项目实践与总结
- QT百度离线地图(一)
- JAVA集合框架工具类自定义Collections集合方法
热门文章
- 什么是cpu?(基础篇)
- 事件委托的灵活运用真不会求指教
- C# winform 魔兽MH全图 :WjeWar V1.5 (完全开源)
- APP Launch 优化
- excel柱状图自定x轴y轴_《excel柱状图自定x轴y轴》 如何更改EXCEL 图表中X轴的名称...
- 知乎上100条简短深刻的回答
- 为你的兔小巢加上实时消息推送
- Ubuntu 18.04 增加swap空间 亲测有效
- 解决Ubuntu与Windows不能复制粘贴问题
- MES1.0实现分析 -制造业数字化探讨(1)