【C++---15】对象指针,对象成员指针,this指针

目录

对象指针:

对象成员指针:

定义:

初始化:

内存中的对象成员指针:

c对象成员和对象成员指针所占的字节数程序测试代码:

this指针:


对象指针:

一个指针用来指向一个对象;

 

通过new运算实例化对象:  Coordinate *p = new Coordinate;

对象在内存中的相关位置和对应关系:

一般提到堆栈,实际上指的是“栈”(stack)。

这个名词在很多地方都会用到:它是一种数据结构。

在描述内存时:一个进程的地址空间的不同区域会有不同的用途。

其中有 堆区(heap)和 栈区(stack)。

函数的调用是在栈中运作的,函数中的那些变量也都在栈中。

其实程序中的大部分变量都在栈中,毕竟程序大量存在函数调用(main函数本身也是函数)。

而手动申请内存(new出来的)构造的变量就在堆中。

实例化的具体范例:

使用new关键字申请内存空间会调用构造函数

而使用malloc申请内存空间只是单纯分配空间,不会调用构造函数 

对象指针就是指向对象的指针。Coordiante *p=new Coordiante;

p->m_fX来访问对象成员,也可以用(*p).m_fX的方式来访问。后者(*p)表示该对象,所有能用.符合访问。

Coordinate p1;  //在栈中实例化一个对象p1
Coordinate *p2=&p1;  //p2指针指向p1的地址
p2->m_iX=19;
(*p2).m_iY=22;
cout << p1.m_iX <<" "<<p1.m_iY<<endl; //可以通过p2操纵p1的相关内存

对象指针演示:

int main(void)
{
	//Coordinate *p1 = NULL;//第一个点,指向NULL
	//p1 = new Coordinate;//因为Coordinate是一个默认的构造函数所以可以没有参数
	//Coordinate *p2 = new Coordinate();
	//p1->m_iX = 10;//两种不同的赋值方法
	//p1->m_iY = 20;
	//(*p2).m_iX = 30;
	//(*p2).m_iY = 40;

	//cout << p1->m_iX + (*p2).m_iX << endl;//输出
	//cout << p1->m_iY + (*p2).m_iY << endl;
	//
	//delete p1;
 //   p1 = NULL;
	//delete p2;
	//p2 = NULL;
/*************************************************************/
	Coordinate p1;//从栈中实例化一个对象

	Coordinate *p2 = &p1;//让p2指向p1,运用了取地址的符号
	//然后就可以用p2来操作p1的数据成员和成员函数了

	p2->m_iX = 10;
	p2->m_iY = 20;

	cout << p1.m_iX << endl;
	cout << p1.m_iY << endl;

	system("pause");
	return 0;
}

对象成员指针:

对象成员指针:对象的指针作为另外一个类的成员;

定义:

Coordinate *m_pCoorA;
Coordinate *m_pCoorB;

初始化:

与对象成员初始化相同;

更多的是下面的方式:

因为是从堆中申请内存,所以析构函数中需要进行内存释放;

内存中的对象成员指针:

  1. 对象成员指针就是对象指针作为类的数据成员。注意,一个指针在32bit操作系统中占4 个字节;

 

  1. 原因:一个字节占8位,32位除以8位,得到的字节数就是sizeof()的结果。
  2. 对象成员是指针的时候,通常要在构造函数中使用new申请内存来初始化,所以记得要在析构函数中用delete释放内存。
  3. 32位的编译环境,一个指针占4个字节,一个字节就是一个基本的内存单元,1Byte = 8 bit,即一个内存单元里可以存储2的8次方不同情况的高低电平。
  4. 32位的sizeof(p)等于4,64位的sizeof(p)等于8。
  5. 因为Line这个类中有,两个对象成员指针,所以占了8个字节。
  6. sizeof()函数返回的是整数,单位为“字节”. (4)64位的是32位的两倍;

c对象成员和对象成员指针所占的字节数程序测试代码:

#include<stdlib.h>
#include <iostream>
using namespace std;

class A {
private:
	int arr[5];
};

class B {
private:
	A obj1;
	A obj2;
};

class C {
private:
	A *pA1;
	A *pA2;
};

int main() {
	cout << "一个int占的字节数:" << sizeof(int) << endl;
	cout << "一个指针占的字节数:" << sizeof(A *) << endl;
	cout << "一个A类的实例占的字节数:" << sizeof(A) << endl;
	cout << "一个带有两个A类成员的B类的实例占的字节数:" << sizeof(B) << endl;
	cout << "一个带有两个指向A类实例的指针成员的C类实例占的字节数:" << sizeof(C) << endl;
	system("pause");
	return 0;
}

this指针:

首先,参数和数据成员不同名;

this指针的作用就是:解决了参数和数据成员重名的问题,让计算机清楚是参数传给了数据成员;

this指针一般都是系统默认调用,以防止在实例化对象调用成员函数的时候出现错误,保证一一对应,当数据成员和构造函数中的形参名字相同时,计算机会分不清楚谁给谁赋值,这是需要人工加上this指针,用来区别。

伐开心~~~~

参考视频:https://www.imooc.com/learn/405

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值