定义常成员函数: 返回值类型 成员函数名[(形参表列)] const;
不论对于常成员变量或是非常变量,还是常对象的数据成员变量,常成员函数都只能是引用这些变量,而不可以改变。
若在程序中需要用改变值的成员变量,可以重新定义一个中间变量,通过改变中间变量的值来实现功能。
/*
设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。
在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,
将这些函数设计为常成员函数是合适的,能够避免数据成员被无意更改。*/
//定义点的类,头文件class.h
class Point
{private:
int x,y;
public:
Point (int a,int b):x(a),y(b){};//带参数的构造函数
Point( ){};//默认构造
void SetP(int a,int b);
void Getp( );
void Distance_p(Point p);//两点之间的距离,对象包含对象
void Distance_Yuan( );
//将成员函数声明为常量,在定义此函数时也需要加“const”,成员函数被定义为常量时了,只能引用成员变量而不能修改
void Symmetry_x( ) const;void Symmetry_y( )const;
void Symmetry_o( )const;
};
//源文件
#include<iostream>
#include<cmath>
using namespace std;
#include "class.h"
int main()
{
Point p1,p2;
p1.SetP(30,40);
p2.SetP(40,50);
p1.Distance_Yuan();
//两点距离
p1.Distance_p(p2);
p2.Distance_p(p1);
cout<<"关于原点对称: "<<endl;
p1.Symmetry_o( );
cout<<"关于Y对称: "<<endl;
p1.Symmetry_y();
cout<<"原始点: "<<endl;
p1.Getp();
return 0;}
void Point::SetP(int a,int b )
{
x=a;
y=b;
}
void Point::Getp( )
{
cout<<"x= "<<x<<'\t'
<<"y= "<<y
<<endl;
}
void Point::Distance_p(Point p)
{
int d1=0;
d1=sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
cout<<"the distance of the two point is: "<<d1<<endl;
}
void Point::Distance_Yuan( )
{ int d=0;
d=sqrt(x*x+y*y);
cout<<"the distance of the point and the 0 is: "<<d<<endl;
}
void Point::Symmetry_x( )const
{
Point p1;//调用默认构造函数---中间变量
p1.x=-x;p1.y=y;
cout<<"x= "<<p1.x<<'\t'
<<"y= "<<p1.y<<endl;
//此处可以将函数返回值设为Point型,return p1;
}
void Point::Symmetry_y( )const
{
Point p2(this->x,this->y);//复制带参数的构造函数
p2.x=x;p2.y=-y;
cout<<"x= "<<p2.x<<'\t'
<<"y= "<<p2.y<<endl;
}
void Point::Symmetry_o( )const
{
Point p3;
p3.x=-x;p3.y=-y;
cout<<"x= "<<p3.x<<'\t'
<<"y= "<<p3.y<<endl;
}
改进:
将三个对称成员函数合成一个,通过判断参数值来确定是哪种类型的对称且有返回值: Point SymmetricAxis(char style) const;//style取'x','y'和'o'分别表示按x轴, y轴, 原点对称
Point point::SymmetricAxis(char style)const
{char c=style;Point p(x,y);
switch(c)
{
case 'x':p.x=-x;break;
case 'y':p.y=-y;break;
case 'o':p.x=-x;p.y=-y;break;
}
return p;
}
用来求两点距离的两种方法及比较(转):http://blog.youkuaiyun.com/sxhelijian/article/details/22877463
【讨论】这里涉及到两种对求距离的处理方法
方法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);
- 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);
(2)在方法1中,p1的数据成员x和y在类的成员函数中可以直接使用,也可以用this->x和this->y访问,这是内部事务;而在方法2中,已经不是类的地盘所在,p1.x、p1.y不能访问对象中的私有成员,需要定义访问私有成员的接口getX()和getY(),才能得到对象中x和y的值,信息隐藏在此发威。