常对象与常成员

一、常对象

概念:如果某个对象不允许修改,则该对象称为常对象。

PS:

(1)不允许常对象调用任何类的成员函数,而且常对象一旦定义,在其生存期内不允许修改,否则导致编译错误。

(2)只有类的常成员函数才能访问该类的常对象,const成员函数依然不允许修改常对象。

(3)const对象不能被任何对象修改,他也不能被其他对象访问。

(4)const对象不能被赋值,必须在定义时由构造函数初始化。

#include<iostream>
using namespace std;

class Clock //定义的Clock类
{
public:
	Clock(int h = 0,int m = 0,int s = 0)//构造函数
	{
		this -> H = h;
		this -> M = m;
		this -> S = s;
	}
	void SetTime(int h = 0,int m = 0,int s = 0)//创建时间
	{
		this -> H = h;
		this -> M = m;
		this -> S = s;
	}
	void ShowTime()//打印时间
	{
		cout << H << ":" << M << ":" << S << endl;
	}

private:
	int H;
	int M;
	int S;
};

int main()
{
	const Clock C1(9,9,9);//定义常对象C1
	Clock const C2(10,10,10);//定义常对象C2
	Clock C3(11,11,11);
	//C1 = C3;//error C1为常对象,不能被赋值
	// C1.ShowTime();//error C1为常对象,不能访问非常成员函数
	C3.ShowTime();
	//C1.SetTime(0,0,0,);// error C1为常对象,不能被更新
	return 0;
}

二、常数据成员

#include<iostream>
using namespace std;

class A
{
public:
	A(int i) : a(i),r(a)
	{
		cout << "constructor !" << endl;
	}
	void display()
	{
		cout << a << "," << b << "," << r <<endl;
	}
private:
	const int & r;//常引用数据成员
	const int a;//常数据成员
	static const int b;//静态常数据成员
};

const int A :: b = 3; //静态常数据成员在类外说明和初始化

int main()
{
	A a1(1);
	a1.display();
	A a2(2);
	a2.display();
	return 0;
}

运行结果:

三、常成员函数

(1)const是函数类型的一个组成成分,因此在函数实现部分也要带有const关键字

(2)常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数

                                                   成员函数与对象之间的操作方式

                     对象

函数

              常对象           一般对象
常成员函数                  V                 V
一般成员函数                  X                 V
class Date
{
public:
	int Year() const;
	int Month() const;
	int Day() const { return D; };
	int Day() { return D++ };
	int AddYear(int i) { return Y + i;  };
private:
	int Y;
	int M;
	int D;

};

PS:容易出现的错误

(1)
int Date :: Month() //error:常成员函数不能缺少const
{
    return M;
} 


(2)
int Date :: Year() const
{
    //return Y ++;  //error 常成员函数不能更新类的数据成员
    rerturn Y;
}

(3)
Date const d1;
//int j = d1.AddYear(10); //error 常对象不能调用非常成员函数
int j = d1.Year(); 

(4)
Date d2;
int i = d2.Year();//非常对象可以调用常成员函数
d2.Day(); //非常对象可以调用非常成员函数

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值