C++远征之封装篇(下)

2-2、对象数组实践

代码:

//Coordinate.h文件

class Coordinate
{
public:
Coordinate();
~Coordinate();
int m_iX;
int m_iY;
private:
};

//Coordinate.cpp文件

#include<iostream>
#include"Coordinate.h"
using namespace std;

Coordinate::Coordinate()
{
cout<<"Coordinate()"<<endl;
}
Coordinate::~Coordinate()
{
cout<<"~Coordinate()"<<endl;
}

//main函数文件

#include<iostream>
#include<stdlib.h>
#include"Coordinate.h"
using namespace std;
/******************************/
/*对象数组
要求:
定义Coordinate类
数据成员:m_iX和m_iY
分别从栈中和堆中实例化长度为3的对象数组
给数组中的元素分别赋值
遍历两个数组
*/
/******************************/
int main(void)
{
Coordinate coor[3];
coor[0].m_iX = 3;
coor[0].m_iY = 5;

Coordinate *p = new Coordinate[3];
p->m_iX = 7;
p[0].m_iY = 9; //等价于p->m_iY = 9;

p++; //p = p+1   p+=1;
p->m_iX = 11;
p[0].m_iY = 13;

p[1].m_iX = 15;
p++;
p->m_iY = 17;

for(int i = 0;i < 3 ;i++)
{
cout<<"coor_x"<<coor[i].m_iX<<endl;
cout<<"coor_y"<<coor[i].m_iY<<endl;
}
for(int j = 0;j < 3;j++)
{
cout<<"p_x"<<p->m_iX<<endl;
cout<<"p_y"<<p->m_iY<<endl;
p--;
}


p++;
delete []p;
p = NULL;

system("pause");
return 0;
}

2-6、对象成员实践

//Coordinate2_6.h文件

{
public:
Coordinate(int x,int y);
~Coordinate();
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_iX;
int m_iY;
};

//Line2_6.h文件

#include"Coordinate2_6.h"
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
~Line();
void setA(int x,int y);
void setB(int x,int y);
void pirntInfo();
private:
Coordinate m_coorA;
Coordinate m_coorB;
};

//Coordinate2_6.cpp文件

#include<iostream>
#include"Coordinate2_6.h"
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
cout<<"Coordinate() "<<m_iX<<" , "<<m_iY<<endl;
}

Coordinate::~Coordinate()
{
cout<<"~Coordinate()  "<<m_iX<<" , "<<m_iY<<endl;
}

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;
}

//Line2_6.cpp文件

#include"Line2_6.h"
#include<iostream>
using namespace std;
Line::Line(int x1,int y1,int x2,int y2):m_coorA(x1,y1),m_coorB(x2,y2)
{
cout<<"Line()"<<endl;
}
Line::~Line()
{
cout<<"~Line()"<<endl;
}

void Line::setA(int x,int y)
{
m_coorA.setX(x);
m_coorA.setY(y);
}
void Line::setB(int x,int y)
{
m_coorB.setX(x);
m_coorB.setY(y);
}
void Line::pirntInfo()
{
cout<<"("<<m_coorA.getX()<<","<<m_coorA.getY()<<")"<<endl;
cout<<"("<<m_coorB.getX()<<","<<m_coorB.getY()<<")"<<endl;
}

//2-6main文件

//2-6对象成员实践
#include<iostream>
#include<stdlib.h>
#include"Line2_6.h"
using namespace std;
/****************************************/
/*对象成员
要求:
定义两个类:
坐标类:Coordinate
数据成员:横坐标m_iX,纵坐标m_iY
成员函数:构造函数、析构函数、数据封装函数
线段类:Line、
数据成员:点A m_coorA,点B m_coorB
成员函数:构造函数、析构函数、数据封装函数、信息打印函数
*/
/****************************************/
int main(void)
{
Line *p = new Line(1,2,3,4);
p->pirntInfo();
delete p;
p = NULL;

system("pause");
return 0;
}

3-2、深浅拷贝实践

代码:

//Array3-2.h文件

class Array
{
public:
Array(int count);
Array(const Array &arr);
~Array();
void setCount(int count);
int getCount();
void printAddr();
void printArr();
private:
int m_iCount;
int *m_pArr;
};

//Array3-2.cpp文件

//3-2深浅拷贝实践
#include<iostream>
#include"Array3-2.h"
using namespace std;
Array::Array(int count)
{
m_iCount = count;
m_pArr = new int[m_iCount];
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = i;
}
cout<<"Array()"<<endl;
}
Array::Array(const Array &arr)
{
m_iCount = arr.m_iCount; //将arr对象中的m_iCount赋值给当前对象中的m_iCount
m_pArr = new int[m_iCount];  //申请一块内存
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = arr.m_pArr[i];
}

cout<<"Array(const Array &arr)"<<endl;
}
Array::~Array()
{
delete []m_pArr;
m_pArr = NULL;
cout<<"~Array()"<<endl;
}
void Array::setCount(int count)
{
m_iCount = count;
}
int Array::getCount()
{
return m_iCount;
}
void Array::printAddr()
{
cout<<"m_pArr的值是:  "<<m_pArr<<endl;
}
void Array::printArr()
{
for(int i=0;i<m_iCount;i++)
{
cout<<m_pArr[i];
}
}

//3-2main函数文件

//3-2浅拷贝实践
#include<iostream>
#include<stdlib.h>
#include"Array3-2.h"
using namespace std;
/*********************************/
/*示例安排:
1.定义一个Array类,数据成员为m_iCount,
 成员函数包含封装函数、构造函数、拷贝构造函数
 和析构函数,通过此例体会浅拷贝原理

2.增加数据成员m_pArr,并增加m_pArr地址查看函数,同时改造
 构造函数、拷贝构造函数和析构函数,体会深拷贝的原理和必要性
/*********************************/
int main(void)
{
Array arr1(6);

Array arr2(arr1);
// cout<<"arr2.m_iCount  "<<arr2.getCount()<<endl;
arr1.printArr();
arr2.printArr();

system("pause");
return 0;
}

4-2、对象指针实践

//Coordinate.h文件

class Coordinate
{
public:
Coordinate();
~Coordinate();
public:
int m_iX;
int m_iY;
private:
};

//Coordinate.cpp文件

#include"Coordinate4_2.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate()
{
cout<<"Coordinate"<<endl;
}
Coordinate::~Coordinate()
{
cout<<"~Coordinate"<<endl;
}

//4-2main函数文件

//C++远征之封装篇4-2C++对象指针实践
#include<iostream>
#include<stdlib.h>
#include"Coordinate4_2.h"
using namespace std;
/**************************************/
/*要求:
定义Coordinate类
数据成员:m_iX和m_iY
声明对象指针,并通过指针操控对象

计算两个点,横、纵坐标的和
/**************************************/
int main(void)
{
/*Coordinate *p1 = NULL;
p1 = new Coordinate;
Coordinate *p2 = new Coordinate();
p1->m_iX = 10;
p1->m_iY = 20;
(*p2).m_iX = 30; //(*p2)使指针变为一个对象
(*p2).m_iY = 40;

cout<<"p1->m_iX + (*p2).m_iX = "<<p1->m_iX+(*p2).m_iX<<endl;
cout<<"p1->m_iY + (*p2).m_iY = "<<p1->m_iY+(*p2).m_iY<<endl;

delete p1;
p1 = NULL;
delete p2;
p2 = NULL; */

Coordinate p1; //用栈实例化对象
Coordinate *p2 = &p1;
p2->m_iX = 10; //等价于(*p2).m_iX = 10;
p2->m_iY = 20; //等价于(*p2).m_iY = 20;

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

system("pause");
return 0;
}

4-5、对象成员指针实践

//Coordinate4_5.h文件

class Coordinate
{
public:
Coordinate(int x,int y);
~Coordinate();
int getX();
int getY();
private:
int m_iX;
int m_iY;
};

//Line4_5.h文件

#include"Coordinate4_5.h"
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
~Line();
void printInfo();
private:
Coordinate *m_pCoorA;
Coordinate *m_pCoorB;
};

//Coordinate4_5.cpp文件

#include"Coordinate4_5.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
cout<<"Coordinate()  "<<m_iX<<","<<m_iY<<endl;
}
Coordinate::~Coordinate()
{
cout<<"~Coordinate()"<<m_iX<<","<<m_iY<<endl;
}
int Coordinate::getX()
{
return m_iX;
}
int Coordinate::getY()
{
return m_iY;
}

//Line4_5.cpp文件

#include"Line4_5.h"
#include<iostream>
using namespace std;
Line::Line(int x1,int y1,int x2,int y2)
{
m_pCoorA = new Coordinate(x1,y1);
m_pCoorB = new Coordinate(x2,y2);  //堆中实例化
cout<<"Line()"<<endl;
}
Line::~Line()
{
delete m_pCoorA;
m_pCoorA = NULL;
delete m_pCoorB;
m_pCoorB = NULL;

cout<<"~Line()"<<endl;
}
void Line::printInfo()
{
cout<<"printInfo()"<<endl;
// cout<<"("<<m_pCoorA->m_iX<<","<<m_pCoorA->m_iY<<")"<<endl;//错误
// cout<<"("<<m_pCoorB->m_iX<<","<<m_pCoorb->m_iY<<")"<<endl;//错误
cout<<"("<<m_pCoorA->getX()<<","<<m_pCoorA->getY()<<")"<<endl;
cout<<"("<<m_pCoorB->getX()<<","<<m_pCoorB->getY()<<")"<<endl;
}

//4-5main文件

//4-5C++对象成员指针实践
#include<iostream>
#include<stdlib.h>
#include"Line4_5.h"
using namespace std;
/******************************/
/*
对象成员指针
要求:
定义两个类:
坐标类:Coordinate
数据成员:横坐标m_iX、纵坐标m_iY
成员函数:构造函数、析构函数、数据封装函数
线段类:Line
数据成员:点A指针m_pCoorA,点B指针m_pCoorB
成员函数:构造函数、析构函数、信息打印函数
/******************************/
int main(void)
{
Line *p = new Line(1,2,3,4);
p->printInfo();
delete p;
p = NULL;

cout<<sizeof(p)<<endl; //打印指针p所占用的内存大小
cout<<sizeof(Line)<<endl; //打印Line所占用的内存大小

system("pause");
return 0;
}

4-7、this指针实践

//Array4_7.h文件

class Array
{
public:
Array(int len);
~Array();
// void setLen(int len);
// Array& setLen(int len);
Array* setLen(int len);
int getLen();
// Array& printInfo();
Array* printInfo();
private:
// int m_iLen;
int len;
};

//Array4_7.cpp文件

#include"Array4_7.h"
#include<iostream>
using namespace std;
Array::Array(int len)
{
// m_iLen = len;
// cout<<"Array() "<<m_iLen<<endl;
//使用this指针
this->len = len;
// cout<<"Array() "<<this->len<<endl;
}
Array::~Array()
{
// cout<<"~Array()"<<endl;
}
//Array& Array::setLen(int len)
Array* Array::setLen(int len)
{
// m_iLen = len;
//使用this指针
this->len = len;
// return *this;
return this;
}
int Array::getLen()
{
return len;
}
//Array& Array::printInfo()
Array* Array::printInfo()
{
// cout<<"len = "<<len<<endl;
// return *this;
cout<<this<<endl; //打印this 的地址
return this;
}

//4-7main文件

//4-7this指针实践(1)
#include"Array4_7.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
/*********************************/
/*示例要求:
定义一个Array类
数据成员:m_iLen表示数组长度
成员函数:
构造函数
析构函数
len的封装函数
信息输出函数printInfo
/*********************************/
int main(void)
{
Array arr1(6);
//  arr1.printInfo().setLen(10).printInfo();
// arr1.printInfo()->setLen(10)->printInfo();
// cout<<arr1.getLen()<<endl;
arr1.printInfo();
cout<<&arr1<<endl; //打印arr1的地址

system("pause");
return 0;
}

5-2、常对象成员和常成员函数实践

//Coordinate5_2.h文件

class Coordinate
{
public:
Coordinate(int x,int y);
~Coordinate();
void setX(int x);
int getX() const;
void setY(int y);
int getY() const;
private:
int m_iX;
int m_iY;
};

//Line5_2.h文件

#include"Coordinate5_2.h"
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
~Line();
void setA(int x,int y);
void setB(int x,int y);
void printInfo();
void printInfo() const;
private:
const Coordinate m_coorA;
Coordinate m_coorB;
};

//Coordinate5_2.cpp文件

#include"Coordinate5_2.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
cout<<"Coordinate()"<<endl;
}
Coordinate::~Coordinate()
{
cout<<"~Coordinate()"<<endl;
}
void Coordinate::setX(int x) 
{
m_iX = x;
}
int Coordinate::getX() const
{
return m_iX;
}
void Coordinate::setY(int y)
{
m_iY = y;
}
int Coordinate::getY() const
{
return m_iY;
}

//Line5_2.cpp文件

#include"Line5_2.h"
#include<iostream>
using namespace std;
Line::Line(int x1,int y1,int x2,int y2):m_coorA(x1,y1),m_coorB(x2,y2)
{
cout<<"Line()"<<endl;
}
Line::~Line()
{
cout<<"~Line()"<<endl;
}
void Line::setA(int x,int y)
{
// m_coorA.setX(x);
// m_coorA.setY(y);
}
void Line::setB(int x,int y)
{
m_coorB.setX(x);
m_coorB.setY(y);
}
void Line::printInfo()
{
cout<<"printInfo()"<<endl;
cout<<"("<<m_coorA.getX()<<","<<m_coorA.getY()<<")"<<endl;
cout<<"("<<m_coorB.getX()<<","<<m_coorB.getY()<<")"<<endl;
}

void Line::printInfo() const
{
cout<<"printInfo() const"<<endl;
cout<<"("<<m_coorA.getX()<<","<<m_coorA.getY()<<")"<<endl;
cout<<"("<<m_coorB.getX()<<","<<m_coorB.getY()<<")"<<endl;
}

//5-2main文件

//5-2常对象成员和常成员函数实践
#include<iostream>
#include<stdlib.h>
#include"Line5_2.h"
using namespace std;
/*************************************/
/* 常对象成员、常函数、常对象
要求:
定义两个类:
坐标类:Coordinate
数据成员:横坐标m_iX,纵坐标m_iY
成员函数:构造函数、析构函数、数据封装函数
线段类:Line
数据成员:点A m_coorA,点B m_coorB
成员函数:构造函数、析构函数、数据封装函数、信息打印函数
/*************************************/
int main(void)
{
// const Line line(1,2,3,4);
// line.printInfo();

Line line(1,2,3,4);
line.printInfo();

system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值