C++第6周(春)项目1 体验常成员函数

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接

【项目1-体验常成员函数】
  设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成员被无意更改。

class CPoint
{
private:
  double x;  // 横坐标
  double y;  // 纵坐标
public:
  CPoint(double xx=0,double yy=0);
  double Distance1(CPoint p) const;   // 两点之间的距离(一点是当前点,另一点为参数p)
  double Distance0() const;            // 到原点的距离
  CPoint SymmetricAxis(char style) const;//style取'x','y'和'o'分别表示按x轴, y轴, 原点对称
  void input();  //以x,y 形式输入坐标点
  void output(); //以(x,y) 形式输出坐标点
};

参考解答:

#include "iostream"
#include "Cmath"
using namespace std;

class CPoint
{
private:
  double x;  // 横坐标
  double y;  // 纵坐标
public:
  CPoint(double xx=0,double yy=0);
  double Distance1(CPoint p) const;   // 两点之间的距离
  double Distance0() const;          // 到原点的距离
  CPoint SymmetricAxis(char style) const;   // 返回对称点
  void input();  //以x,y 形式输入坐标点
  void output(); //以(x,y) 形式输出坐标点
};

CPoint::CPoint(double xx,double yy)
{
  x=xx;
  y=yy;
}

// 输入坐标点
void CPoint::input()
{
  char ch;
  cout<<"请输入坐标点(格式x,y ):";
  while(1)
  {
    cin>>x>>ch>>y;
    if (ch==',') break;
    cout<<"输入的数据格式不符合规范,请重新输入\n";
  }
}

// 输出坐标点
void CPoint::output()
{
  cout<<"("<<x<<", "<<y<<")"<<endl;
}

// 求两点之间的距离
double CPoint::Distance1(CPoint p) const
{
  double d;
  d=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
  return d;
}

// 求点到原点的距离
double CPoint::Distance0() const
{
  double d;
  d=sqrt(x*x+y*y);
  return d;
}

// 求对称点, style取'x','y'和'o'分别表示按x轴, y轴, 原点对称
CPoint CPoint::SymmetricAxis(char style) const
{
  CPoint p(this->x,this->y);//用复制构造函数时,写作p(*this)
  switch(style)
  {
  case 'x':
    p.y=-y; break;
  case 'y':
    p.x=-x; break;
  case 'o':
    p.x=-x;p.y=-y;
  }
  return p;
}

int main( )
{
  double distance;
  CPoint p1,p2,p;
  cout<<"第1个点p1,";
  p1.input();
  cout<<"第2个点p2,";
  p2.input();
  distance=p1.Distance1(p2);
  cout<<"两点的距离为:"<<distance<<endl;
  distance=p1.Distance0();
  cout<<"p1到原点的距离为:"<<distance<<endl;
  p=p1.SymmetricAxis('x');
  cout<<"p1关于x轴的对称点为:";
  p.output();
  p=p1.SymmetricAxis('y');
  cout<<"p1关于y轴的对称点为:";
  p.output();
  p=p1.SymmetricAxis('o');
  cout<<"p1关于原点的对称点为:";
  p.output();
  return 0;
}

  对比CPoint::Distance1(CPoint p)函数定义理解下面的内容。

 

【要点理解】

  有同学提出能不能在参数中给出两点,求这两点间的距离?当然可以。看下面的例子

#include <iostream>
#include <Cmath>
using namespace std;

class CPoint
{
private:
	double x;  // 横坐标
	double y;  // 纵坐标
public:
	CPoint(double xx=0,double yy=0):x(xx),y(yy){};
	double getX(){return x;}
	double getY(){return y;}
};

double distance1(CPoint p1,CPoint p2)
{
	double d;
	d=sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));
	return d;
}

void main( )
{
	double d;
	CPoint p1(2,3),p2(-5,1);
	d=distance1(p1,p2);
	cout<<"两点的距离为:"<<d<<endl;
	system("pause");
}

【讨论】这里涉及到两种对求距离的处理方法

  方法1:用类的成员函数实现

  成员函数的定义:

// 求两点之间的距离
double CPoint::Distance1(CPoint p) const
{
	double d;
	d=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));//将(p.x-x)更改为(p.x-this->x)可以更便于理解,d是当前点*this和参数给出的点p间的距离
	return d;
}

  调用成员函数求距离:

	double d;
	CPoint p1(2,3),p2(-5,1);
	d=p1.distance1(p2); //或d=p2.distance(p1);

  方法2:用一般函数实现

double distance1(CPoint p1,CPoint p2)//注意:这不是类的成员函数
{
	double d;
	d=sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));
	return d;
}

  调用函数求距离:

	double d;
	CPoint p1(2,3),p2(-5,1);
	d=distance1(p1,p2);

  (1)在方法1中函数调用d=p1.distance1(p2);是典型的面向对象思维,求距离distance是对象p1的行为,是p1的功能,是p1求对p2的距离,p1是这个动作的发起者,p2为这个动作提供数据;方法2是面向过程的思维,在main()函数中,由main()作主求距离,求的是p1和p2距离,p1和p2地位平等。

  (2)在方法1中,p1的数据成员x和y在类的成员函数中可以直接使用,也可以用this->x和this->y访问,这是内部事务;而在方法2中,已经不是类的地盘所在,p1.x、p1.y不能访问对象中的私有成员,需要定义访问私有成员的接口getX()和getY(),才能得到对象中x和y的值,信息隐藏在此发威。

china-pub | 亚马逊 | 京东
当当  | 豆瓣 
图灵社区  官方样章下载
==================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章分类目录(不定期更新)  ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====
时间: 2024-11-01 15:15:58

C++第6周(春)项目1 体验常成员函数的相关文章

2013级C++第6周(春)项目——对象指针、const

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 推荐"玻璃罩const"系列的三篇文章(http://blog.csdn.net/sxhelijian/article/details/7385683),掌握利用const完成数据保护. 1. 使用常对象--为共用数据加装一个名为const的玻璃罩: 2. 常(const)+ 对象 + 指针:玻璃罩到底保护哪一个:

2013级C++第14周(春)项目——多态性、虚函数和抽象类

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 阅读程序1.阅读.修改和运行关于交通工具类的程序,回答问题,以理解相关技术方法(1)请写出程序的执行结果,并在上机时对照理解 #include <iostream> using namespace std; class Vehicle //交通工具 { public: void run() const { cout <<

2013级C++第2周(春)项目——结构体应用大体验

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 第一部分 结构体应用 [项目1-学生成绩统计]   每位同学的信息学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[12]).姓名(name).三门课的成绩(grade).总分(score).均分(average)). (1)从键盘上输入N名学生的信息(N定义为常变量

2013级C++第11周(春)项目——通过继承拥有基类的资源

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 (注:本课资料由第9周直接到第11周,因为第10周是我校春假期,全校休课.春假,实际是五一.清明.端午打包一起休息,这亲戚的做法对按周安排活动的学校更好一些.) 第一部分 程序阅读 程序阅读1:  #include<iostream> using namespace std; class A { private: int x; protect

C++第2周(春)项目3 文件+结构体实现实用系统

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-文件+结构体实现实用系统]score.txt(本文后提供了一部分数据,自行copy建文本文件)中是一些同学的学号.姓名.C++.高数.英语成绩,利用前两个项目中定义的结构体数组,读取文件中的数据,完成下面的应用: (1)从文件中读出数据,存放到结构体数组中: 博文"C++文件操作初体验"http://blog.csdn.ne

2013级C++第8周(春)项目——运算符重载

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1]实现复数类中的运算符重载(1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(C

C++第5周(春)项目4 指向学生类的指针

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4-指向学生类的指针] 设计一个学生类Student,数据成员包括学号(num)和成绩(score),成员函数根据需要自行设计(建议配备需要的set.get函数,以及必要的输入或输出,给出的代码中也可以找到需要成员函数的线索).在main函数中,要做到: 建立一个对象数组,通过初始化,设置5个学生的数据,要求: 用指针指向数组首元素,输出

2013级C++第5周(春)项目——用构造函数初始化

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答   有同学总结:老二说用数组法做给了我思路,真是有兄弟,不孤单.做了这道题才发现以前没用数组法做的那个判断第几天的程序结果存在错误. 我评论:每个人身边都有一帮子兄弟.靠兄弟,就不用靠老师.兄弟总在身边,弟兄们一起长大! 还有,实践中感受到的,就是真正学习到的.在学习中,只有将直接的体验与老师的讲解.看过的书交融起来,才能真

C++第7周(春)项目4 友元类

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4-友元类] 定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个DateTime,日期.时间都处理更好) class Date; //对Date类的提前引用声明 class Time { public: Time(int,int,int); void add_a_second(Date &);