C++常对象、常成员函数的学习
#include "stdafx.h"
#include <iostream>
using namespace std;
class R
{
private:
int r1,r2;
public:
R(int r1=0,int r2=0):r1(r1),r2(r2){}//构造函数
void chang();
//void print();
void print() const;//常成员函数
void test();
};
void R::chang()
{
r1=10;
}
/*void R::print()
{
chang();
cout<<r1<<": "<<r2<<endl;
}*/
void R::print() const
{
//chang() 在常成员函数被调用期间目的对象都被视为常对象 常成员函数不能
//更新目的对象的数据成员,也不能针对目的对象调用该类中没有const修饰的成员函数
cout<<r1<<";"<<r2<<endl;
}
void R::test()
{
cout<<"test success!"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
R a(4,5);//一般对象
const R b(6,7);//常对象
a.print();
a.print();//非常对象可以调用常成员函数
b.print();
// b.test(); 常对象只能调用常成员函数
return 0;
}
常成员函数的一些注意:
1 const是函数类型的一个组成部分所以函数的定义部分也要带上const
2 const关键字可以用于函数重载的区分
3常对象只能调用常成员函数
4常成员函数调用期间不管目的对象是否是常对象都将被视为常对象遵守常对象的规则。
常数据成员注意:
1任何函数都不能对常数据成员赋值
2构造函数对常数据成员初始化只能通过初始化列表
要想在常成员函数的调用中改变数据的值 使用mutable 关键字
eg:
class Point
{
private:
int x,y;
public:
Point(int x=0,int y=0):x(x),y(y){}
Point(Point &p);
~Point(){};
int getx()const{return x;}
int gety()const{return y;}
};
Point::Point(Point &p)
{
x=p.x;
y=p.y;
}
class Line
{
private:
Point p1,p2;
mutable double len;//使用mutable 修饰的len可以通过调用常函数修改
public:
Line(Point &p1, Point &p2):p1(p1),p2(p2),len(-1){}
double getlen () const;
};
double Line::getlen() const
{
double a,b;
if(len<0)
{
a =static_cast<double>(p1.getx()-p2.getx());
b =static_cast<double>(p1.gety()-p2.gety());
}
len =sqrt(a*a+b*b);//修改
return len;
}