C++笔记(Ⅲ_封装(下))

C++对象数组和对象成员
对象数组

例子:

class Coordinate
{
public:
  int m_iX;
  int m_iY;
};
int main(void)
{
Coordinate coord[3];
coord[1].m_iX = 10;
Coordinate *p = new Coordinate[3];
p[0].m_iY = 20; //等价于p->m_iY = 20;
delete []p;
p=NULL;
return 0;
}
对象成员

初始化时先初始化成员对象,再初始化总对象,销毁时先销毁总对象再销毁其中成员对象。

//使用对象成员的例子
//demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Line.h"
using namespace std;

int main(void)
{
  Line *p =new Line();
  delete p;
  p=NULL;
  system("pause");
  return 0;
}
//Line.cpp
#include "Line.h"
void Line::setA(int x,int y)
{
 m_coorA.setX(x);
 m_coorA.setY(y);
}
void setB(int x,int y)
{
 m_coorB.setX(x);
 m_coorB.setY(y);
}
void Line::printInfo()
{
 cout << "("<< m_coorA.getX()<<","<<m_coorA.getY()<<")"<<endl;
}
//Line.h
#include "Coordinate.h"
class Line
{
public:
  Line(){}
  ~Line(){}
  void setA(int x,int y);
  void setB(int x,int y);
  void printInfo();
private:
  Coordinate m_coorA;
  Coordinate m_coorB;
};
//Coordinate.cpp
#include "Coordinate.h"
void Coordinate::setX(int x)
{
 m_iX = x;
}
int Coordinate::getX()
{
 return m_iX;
}
void Coordinate::setY(int y)
{
 m_iY = y;
}
int Coordinate::getY()
{
 return m_iY;
}
//Coordinate.h
class Coordinate
{
public:
  Coordinate(){}
  ~Coordinate(){}
  void setX(int x);
  int getX();
  void setY(int y);
  int getY();
private:
  int m_iX;
  int m_iY;
};
C++深拷贝与浅拷贝

如何实现拷贝构造函数并不简单,对象间的拷贝大致为为两种情况,深拷贝和浅拷贝。

深拷贝

当进行对象拷贝时,不是简单的做值的拷贝,而是将堆中内存的数据也进行拷贝,这种拷贝模式就叫做深拷贝。

浅拷贝

只是将数据成员的值进行了简单的拷贝。
如果遇到指针的时候,仅拷贝了地址,因此两个指针指向了同一个内存地址,我们希望的并不是这样,我们所期望的是,指向另一个地址空间,但是将原指针指向的地址当中的内容复制了过来。因此需要考虑使用深拷贝。

C++对象指针

C++中的new会自动的调用相关对象的构造函数,而在C语言中使用malloc只会分配相关内存并不会自动调用对象的构造函数。

//简单例子
//已经定义了一个Coordinate类
Coordinate *p1 = NULL;
p1 = new Coordinate();
Coordinate *p2 =new Coordinate();
p1->m_iX=10;
p1->m_iY=20;
//不同的方法,意义一样
(*p2).m_iX=30;
(*p2).m_iY=40;
delete p1;
p1 = NULL;
delete p2;
p2 = NULL;
对象成员指针

对象的指针作为另外一个类的对象成员。
指针类型占4个基本内存单元

//前提已经申明好Coordinate类
//Line.h
#include "Coordinate.h"
class Line
{
public:
    Line(int x1,int y1,int x2,int y2);
    ~Line();
    void printInfo();
private:
    Coordinate *m_pCoorA;
    //在构造函数中去实例化这个对象
    //在析构函数中去删除这两个对象
    Coordinate *m_pCoorB;
};
this指针

Array arr1
this 等价于&arr1

class Array
{
public:
  Array(int len){this->len=len;}
  int getLen(){return len;}
  void setLen(int len){this->len=len;}
private:
  int len;
};
const关键字(在c++笔记Ⅰ出现过基础部分)
常对象成员和常成员函数
class Coordinate
{
public:
  Coordinate(int x,int y);
  void changeX() const; //常成员函数
  void changeX();
private:
  int m_iX;
  int m_iY;
};
//常对象成员
class Line
{
public:
  Line(int x1,int y1,int x2,int y2);
private:
  const Coordinate m_coorA;
  const Coordinate m_coorB;
};
//常对象
const Line line(1,2,3,4);
//常对象会调用常成员函数
对象的常指针和常引用
Coordinate coor1(3,5);
//对象的常引用
const Coordinate &coor2 =coor1;
//对象的常指针
const Coordinate *pCoor =&coor1;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值