优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++|类与对象中的const:常对象、常成员函数、常数据成员

nanyue 2024-07-18 22:19:54 技术文章 8 ℃

在C++中,const可以用来声明常量(包括指针和指针指向的变量),也可以在函数参数中用来修饰共享内存空间的指针或引用。同时,const还可以用在类和对象中,用于修饰对象和类的数据成员。

1 常数据成员

有时我们希望某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现。

任何数据成员都不能在类中初始化,因为类只是一个类类型,只是提供了一个分配内存的蓝图,需要在定义对象时才能实际按这个蓝图去实现。也不能在构造函数体中进行赋值初始化,因为在构造函数的形参表中相当于做了声明,需要第一时间初始化,而到了函数体中的赋值操作,相当于是数据的更新操作,而不是初始化的。但常量是需要第一时间初始化的,C++编译器的做法是在类的构造函数的初始化列表中初始化 const 数据成员。

const 数据成员的含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。

#include<iostream.h>
class CCircle
{
	double r;
	const double PI;
public:
	CCircle(double rr=0,double pi=3.14159):r(rr),PI(pi){}
	double Area()
	{return PI*r*r;}
};
void main() 
{ 
	CCircle cir(2);
	cout<<cir.Area()<<endl;
	CCircle cir2(2,3.14);
	cout<<cir2.Area()<<endl;
	cin.ignore();
}
/*
12.5664
12.56
*/

怎样才能建立在整个类中都恒定的常量呢?别指望 const 数据成员了, 应该用类中的枚举常量来实现。例如

	class A
	{
	//…
	enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
	int array1[SIZE1];
	int array2[SIZE2];
	};

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

2常成员函数和常对象

const 用于修饰成员函数,表示该函数不能修改类成员数据,常量成员函数一般用常量对象来调用,而同名的成员函数可以被非常量对象来调用;

#include <iostream.h>
class R
{
public:
 R(int r1,int r2) {R1=r1;R2=r2;}
 void print();
 void print() const;
private:
 int R1,R2;
};
void R::print()
{
 cout<<R1<<":"<<R2<<endl;
}
void R::print() const
{
 cout<<R1<<";"<<R2<<endl;
}
void main()
{
 R a(5,4); 
 a.print();
 const R b(20,52);
 b.print();
}

-End-

最近发表
标签列表