面向对象程序中的常量

一、常数据成员

使用constkeyword进行说明的数据成员,称为常数据成员。其作用和使用方法与一般常变量(const变量)相似,但常数据成员的值是不能改变的。

注意:仅仅能通过构造函数的參数初始化表对常数据成员进行初始化,不能採用在构造函数中对常数据成员赋初值的方法。

比如:

如在类体中定义了常数据成员age:

const int age;    //声明age为常数据成员

在类外定义构造函数,应写成下面形式:

CStudent∷Cstudent(int a):age (a){……}//通过參数初始化表对常数据成员age初始化。

CStudent∷Cstudent(int a){age=a;}     //错误,不能在函数体中初始化常数据成员。

注:为了与长对象进行差别,特别强调常数据成员能够被非const和const类型函数仅仅读。

二、常对象

1、定义

常对象:对象的全部成员在程序中不能被改动,数据初始化后即为仅仅读模式。

2、定义常对象的一般形式为

类名 const 对象名[(实參列表)];

const 类名 对象名[(实參列表)];

比如:一个日期对象始终表示2000年5月1号,能够定义为:

Cdate const d1(2000,5,1);        //d1是常对象

3、注意

以Cdate类为例,该类的定义例如以下:

<pre name="code" class="cpp">#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

//日期类声明
class Cdate
{
public:
	Cdate(int y=1985, int m=1,int d=1) //日期类的构造函数
	{
		year=y;
		month=m;
		day=d;
		cout<<"调用日期类的构造函数"<<endl;
	}

	Cdate(Cdate &s) //日期类的拷贝构造函数
	{
		year=s.year;
		month=s.month;
		day=s.day;
		cout<<"调獭用日期类的拷贝构造函数"<<endl;
	}

	~ Cdate()
	{
		cout<<"调用日期类的析构函数"<<endl;
	}
	void Print()
	{
		cout<<"调用Print()函数:"<<endl;
		cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
	}
private:
	int year,month ,day;	//定义3个整型变量,分别表括示日期的年月日
};

int _tmain(int argc, _TCHAR* argv[])
{
	Cdate d1(2001,5,1);
	d1.Print();
	system("pause");
	return 0;
}

1)常对象在定义时必需要有初值,通过带參数的构造函数或构造函数的參数初始化表进行初始化。

Cdate d1(2000,5,1);          //一般对象

Cdate const d2 ;             // d2是常对象

d2=d1;           //错误,常对象必须在定义的时候赋初值

2)常对象仅仅能以仅仅读的方式訪问常成员函数,而不能訪问很成员函数。

假设希望成员函数可引用常对象中的数据成员,仅仅需将该成员函数声明为const就可以。

声明格式:返回值类型 函数名() const

注意const修饰符的位置在最后面,且构造析构函数不用const修饰!

比如:

const Cdate d1(2000,5,1);          //一般对象

d1.Print();

则会报出例如以下错误:error C2662: “°Cdate::Print”: 不能将“this”指针从“const Cdate”转换为“Cdate &”;

改为:void print() const;       //将函数声明为const,即常成员函数。

常成员函数能够訪问常对象中的数据成员,但仍然不同意改动常对象中数据成员的值。

三、常成员函数

使用constkeyword进行说明的成员函数,称为常成员函数。常成员函数仅仅能读取本类中的数据成员(非const数据成员和const数据成员),而不能改动它们的值。非const成员函数能够引用 const数据成员。

常成员函数说明格式例如以下:

类型标识符  函数名  ( 參数表 ) const;

常量的应用:

1) 假设在一个类中,有些数据成员的值同意改变,还有一些数据成员的值不同意改变,则能够将一部分数据成员声明为const,以保证其值不被改变,能够用非const的成员函数引用这些数据成员的值,并改动非const数据成员的值。

2) 假设要求全部的数据成员的值都不同意改变,则能够将全部的数据成员声明为const,或将对象声明为const(常对象),然后用const成员函数引用数据成员,这样起到“双保险”的作用,切实保证了数据成员不被改动。

3) 假设已定义了一个常对象,仅仅能调用当中的const成员函数,而不能调用非const成员函数(不论这些函数是否会改动对象中的数据)。这是为了保证数据的安全。假设须要訪问对象中的数据成员,可将常对象中全部成员函数都声明为const成员函数,但应确保在函数中不改动对象中的数据成员。

				
时间: 2024-08-08 01:25:52

面向对象程序中的常量的相关文章

java中的常量

所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 程序中使用常量可以提高代码的可维护性.例如,在项目开发时,我们需要指定用户的性别,此时可以定义一个常量 SEX,赋值为 "男",在需要指定用户性别的地方直接调用此常量即可,避免了由于用户的不规范赋值导致程序出错的情况. 伙计们注意啦:常量名一般使用大写字符

浅谈C#中的常量、类型推断和作用域

浅谈C#中的常量.类型推断和作用域 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-19我要评论 这篇文章主要介绍了C#中的常量.类型推断和作用域,有需要的朋友可以参考一下 一.常量常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特征: 1.常量必须在声明时初始化.指定了其值以后,就不能再修改了.2.常量的值必须能在编译时用于计算.因此不能从

【转载】程序中的堆 栈 可读写数据区 常量区 代码区

一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块

C程序中头文件相互包含精华(转载)

C程序中头文件相互包含精华(网摘小结) 收藏(转自:http://blog.csdn.net/lingyun3429/archive/2010/04/27/5535191.aspx).h中一般放的是同名.c文件中定义的变量.数组.函数的声明,需要让.c外部使用的声明. 1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 常量,结构,类型定义,函数,

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

如何给程序中的变量起个好名字

新手程序员总是把大量的时间用在学习编程语言上,学习语法,技术和开发工具,他们认为如果掌握了这些就是一个优秀的程序员.但是,实际的编程不仅是要精通技术和工具,关键是要对某个特定领域的问题给出解决方案,而且通常要和其他程序员一起合作完成.因此,很重要的一点就是,程序员要用代码准确的表达出自己的思想,从而让其他人明白程序的含义. 编程大师Robert C. Martin在<Clean Code>中说道:“使用注释是为了弥补我们代码表意上的不足.”这句话就意味着如果你的代码需要添加注释,就说明你的代码

在C#程序中实现插件架构

阅读提示:这篇文章将讲述如何利用C#奇妙的特性,实现插件架构,用插件(plug-ins)机制建立可扩展的解决方案. 在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制.其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的.然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题.这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的解决方案.后面也将提供一个简要的例子,你甚至可以用这个东西来替换那些已经在很多系统中广泛使用的独立的程

0x3f3f3f3f...编程中无穷大常量的设置技巧

转自 http://aikilis.tk/ 如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:if (d[u]

将应用程序中的商业逻辑同对其提供支持的通用服务进行分离(转)

AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系.对于其