C++之指针(对象指针+对象成员指针+this指针[待补充])
2017-03-03 17:36
441 查看
对象指针
对象指针就是指针指向一个对象。
在实例化时,p的指针实际指向的是m_iX,在实例化对象时,下列代码中的注释部分也是符合语法的。
对象成员指针
对象成员是指作为一个对象来说成为另一个类的数据成员。那么对象成员指针则是对象的指针作为另一个类的数据成员。
代码1
在构造函数时,可以初始化列表构造,也可以普通构造,因为是指针,所以可以置位NULL
代码2
当然更多是赋予指针值
代码3
当然对于对象成员和对象成员指针,他们还有另外一个最大的不同
用对于对象成员来说,如果我们使用sizeof(line)这个对象的话,他就应该是里面所有对象的体积的总和应该是16,而对象成员指针则不同,在代码1中我们写了两个指针作为对象成员,在32位上,每个指针占4位,两个指针则占8个。下面我们来看一看内存中的对象成员指针。
当示例化line时,里面的两个对象成员指针也会生成出来,都是指针类型的,所以每个都会占4个内存单元,如果我们在构造函数当中通过new这样的运算符从堆中申请内存,实例化两个Coordinate这样的对象的话呢,这两个Coordinate对象都是在堆中的,而不再line这个对象当中,所以刚才我们使用sizeof的时候也只能得到8
当我们销毁line这个对象的时候呢,我们也应该先释放掉堆中的内存,然后再释放掉line这个对象。
this指针
一般来说类函数的传递参数和成员不重名,如下所示
那么如果重名的话会发生什么?如下代码,编译器会报错,因为无法分辨哪个是作为参数的Len
因此我们需要一种技术来标注出参数或者标记出数据成员。这就是this指针。
对象指针就是指针指向一个对象。
class Coordinate//坐标系上的点 { public: int m_iX; int m_iY; }; Coordinate *p = new Coordinate;//在堆中实例化
在实例化时,p的指针实际指向的是m_iX,在实例化对象时,下列代码中的注释部分也是符合语法的。
int main() { Coordinate *p = new Coordinate;//在堆中实例化 p->m_iX = 10;//(*p).m_iX=10; p->m_iY = 20;//(*p).m_iY=20; delete p; p = NULL; return 0; }
对象成员指针
对象成员是指作为一个对象来说成为另一个类的数据成员。那么对象成员指针则是对象的指针作为另一个类的数据成员。
代码1
class Coordinate//坐标系上的点 { public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; class Line//坐标系上的线 { public: Line(); ~Line(); private: Coordinate *m_pCoorA; Coordinate *m_pCoorB; };
在构造函数时,可以初始化列表构造,也可以普通构造,因为是指针,所以可以置位NULL
代码2
Line::Line() :m_pCoorA(NULL), m_pCoorB(NULL)//初始化列表初始 { } Line::Line()//普通初始化 { m_pCoorA=NULL; m_pCoorB=NULL; }
当然更多是赋予指针值
代码3
Line::Line()//普通初始化 { m_pCoorA=new Coordinate(1,3); m_pCoorB=new Coordinate(5,6); } Line::~Line() { delete m_pCoorA; delete m_pCoorB; }
当然对于对象成员和对象成员指针,他们还有另外一个最大的不同
用对于对象成员来说,如果我们使用sizeof(line)这个对象的话,他就应该是里面所有对象的体积的总和应该是16,而对象成员指针则不同,在代码1中我们写了两个指针作为对象成员,在32位上,每个指针占4位,两个指针则占8个。下面我们来看一看内存中的对象成员指针。
当示例化line时,里面的两个对象成员指针也会生成出来,都是指针类型的,所以每个都会占4个内存单元,如果我们在构造函数当中通过new这样的运算符从堆中申请内存,实例化两个Coordinate这样的对象的话呢,这两个Coordinate对象都是在堆中的,而不再line这个对象当中,所以刚才我们使用sizeof的时候也只能得到8
当我们销毁line这个对象的时候呢,我们也应该先释放掉堆中的内存,然后再释放掉line这个对象。
this指针
一般来说类函数的传递参数和成员不重名,如下所示
class Array { public: Array(int _len){ len = _len; } int getLen(){ return len; } void setLen(int _len){ len = _len; } private: int len; };
那么如果重名的话会发生什么?如下代码,编译器会报错,因为无法分辨哪个是作为参数的Len
class Array { public: Array(int len){ len = len; } int getLen(){ return len; } void setLen(int len){ len = len; } private: int len; };
因此我们需要一种技术来标注出参数或者标记出数据成员。这就是this指针。
相关文章推荐
- 静态成员函数、this指针、对象指针和动态对象使用小结
- C++ 类 & 对象-C++ 内联函数-C++ this 指针-C++ 类的静态成员
- C++关于this指针、静态变量和静态成员函数
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 通过指针对结构体成员对象的访问输出C/C++
- 从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
- C++特性探寻-继承、成员函数、this指针
- C++:指向对象成员函数的指针
- C++点滴——const/volatile不能用来修饰没有this指针的成员函数
- c++对象数组和this指针
- c++之this指针做参数实现对象间的交互实例
- c++ 指向 类成员函数(thiscall)的 函数指针
- C++成员函数 this指针 调用约定
- C++(typedef、一维数组转成二维数组、C和C++区别、成员地址成员指针、构造析构函数、this指针、const用法、显示时间、const用法)
- 21天学通c++之第二周 指针 8.6 访问自由存储区中对象的成员数据
- C++对象指针—指向对象成员的指针
- this指针访问对象的数据成员
- C++对象的复制——具有指针成员的类的对象的复制
- C++ 通过对象方式 、指针方式两种方式去访问成员变量(属性或者方法)
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?