目录
对象指针:
一个指针用来指向一个对象;
通过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;
初始化:
与对象成员初始化相同;
更多的是下面的方式:
因为是从堆中申请内存,所以析构函数中需要进行内存释放;
内存中的对象成员指针:
- 对象成员指针就是对象指针作为类的数据成员。注意,一个指针在32bit操作系统中占4 个字节;
- 原因:一个字节占8位,32位除以8位,得到的字节数就是sizeof()的结果。
- 对象成员是指针的时候,通常要在构造函数中使用new申请内存来初始化,所以记得要在析构函数中用delete释放内存。
- 32位的编译环境,一个指针占4个字节,一个字节就是一个基本的内存单元,1Byte = 8 bit,即一个内存单元里可以存储2的8次方不同情况的高低电平。
- 32位的sizeof(p)等于4,64位的sizeof(p)等于8。
- 因为Line这个类中有,两个对象成员指针,所以占了8个字节。
- 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指针,用来区别。
伐开心~~~~