C++常对象、常成员函数的学习

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值