从Java到C++——常量值的定义和基本用法

程序中常常会用到常量值来定义一些相对固定的有实际意义值。比如,你要定义一个扑克牌的类,扑克牌有花色和数字两种属性,然而花色只有红桃(红心)、方块、黑梅、黑桃四种,这时你就可以定义四个常量分别表示这四种花色,这样定义的好处是:每次给花色赋值时只用到常量值的名称就可以,不易出错;如果某一天扑克出现新玩法需增加一个花色,只有增加一个常量值就可以,扩展性强;

Java中常量的定义

Java中常量的定义,最常见的就是以下形式:

public static final T [CONSTNAME] = [VALUE];

T是数据类型,可以是基本数据类型,也可以是类;CONSTNAME常量的名称,通常用大写表示;VALUE常量值,必须是一个确定的值,或本身是一个编译时确定值的静态变量。这种常量定义方式的优点可通过修饰它的三个关键字进行阐述:

public:声明了这个常量值可以被其它类访问,不仅限于类本身;

static:声明了这个常量值是静态的,可通过定义该常量的类的类名直接进行调用,而不用创建对象;

final:声明了这个常量值一经定义,其值不可以再被改变;

关于常量的这种定义和用法,相信做过Android开发的都会深有体会,Android的R.java文件中定义的各种资源的内部类和ID全都是通过这种方式定义的。当然常量的定义不止上面这一种形式,可以是非public,非static的,这是上面这种形式用的最多。针对文章开头提到的扑克牌问题,Java的定义如下:

/**
 * 纸牌
 * @author xiaoxu
 *
 */
public class Card {
	/**
	 * 红桃(红心)
	 */
	public static final int HEART = 0;
	/**
	 * 方块
	 */
	public static final int DIAMOND = 1;
	/**
	 * 黑梅
	 */
	public static final int BLACKBERRY = 2;
	/**
	 * 黑桃
	 */
	public static final int SPADE = 3;
	/**
	 * 张牌,随机发四张牌
	 * @return 返回发牌的数组,如c[0][0]表示第一张牌的数字(大小),c[0][1]表示第一张牌的花色
	 */

	private int flowerColor;
	private int size;

	public Card() {
		super();
	}
	public Card(int flowerColor, int size) {
		this.flowerColor = flowerColor;
		this.size = size;
	}
	public int getFlowerColor() {
		return flowerColor;
	}
	public void setFlowerColor(int flowerColor) {
		this.flowerColor = flowerColor;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
}

可能有些人会认为红牌的花色是一组相同概念的值,为什么不定义枚举类型。在C++中你可以定义成枚举类型,因为C++中枚举类型的枚举成员都是常量值;但在Java中,枚举其实是一个类类型,采用枚举类型反而效率不高,且使用不太方便。在C++中,只要表示一组相同概念的常量,都可以而且应该用枚举类型,使代码可读性高;在Java中,能用final常量表示的都不建议用枚举类型,除非一些会使代码很难理解不得不用的地方。

C++中常量的定义

C++中常量的定义用const,类似于Java的final。const的定义形式如下:

const T [CONSTNAME] = [VALUE];

T是数据类型,可以是基本数据类型,也可以是类;CONSTNAME常量的名称,const对象CONSTNAME一旦创建就不可以再改变;VALUE常量值,可以是具体的值,也可以常量表达式。

class T{
public:
	T():i(0){};
	int i;
};

int getValue()
{
	return 12;
}

void PointerTest()
{
	T t;
	const T CONSTNAME = t;	//用T类型的常量对象
	int value = 5;
	const int MIN = value;	//可用非常量值变量对const对象进行初始化
	const int MAX = 10;		//可以用数值直接进行初始化
	int max = MIN;			//也可以用常量值给非const变量赋值
	const int CONST_VALUE = getValue();	//用常量表达式对const变量进行进行初始化
	cout << t.i << endl;
	cout << MIN << endl;
	cout << MAX << endl;
	cout << CONST_VALUE << endl;
}

const常量在类中的定义和使用:

class Card
{
public :
	/**
	 * 红桃(红心)
	 */
	static const int HEART = 0;
	/**
	 * 方块
	 */
	static const int DIAMOND = 1;
	/**
	 * 黑梅
	 */
	static const int BLACKBERRY = 2;
	/**
	 * 黑桃
	 */
	static const int SPADE = 3;
	/************************************************************************/
	/*定义其它的内容
	/************************************************************************/
};

int main()
{
	cout << Card::BLACKBERRY << endl;
	return 0;
}

从Java到C++——常量值的定义和基本用法,布布扣,bubuko.com

时间: 2024-08-02 11:05:03

从Java到C++——常量值的定义和基本用法的相关文章

通过反射获取常量值

一:通过反射获取常量值,项目中有个需求需要将请求信息封装到javaBean中 但是请求信息比较特殊,需要通过编码去获取,而且编码是定义在接口类中的常量,所以为了方便 特别把这块功能封装起来 1:定义的常量 1 /** 2 * 3 */ 4 package com.hlcui.entity; 5 6 /** 7 * @author Administrator 8 * 9 */ 10 public interface ConstantsUtil { 11 12 public static inter

java串讲之String 如何定义字符串对象

如何定义字符串对象?String s = "abc";只要是双引号引起的数据都是字符串对象. 特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中.因为String类是final修饰的 ------------------------------------------------------ String s1 = "abc"; // s1指向的内存中只有一个对象abc. String s2 = new String("abc")

Java程序员常犯的10个错误

本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> list = Arrays.asList(arr); Arrays.asList() 实际上返回一个ArrayList,但是这个ArrayList是Arrays的一个内部私有类,而不是java.util.ArrayList类.这个私有类java.util.Arrays.ArrayList有set(), get(), c

JAVA final关键字,常量的定义

final(最终)是一个修饰符1.final可以修饰类,函数,变量(成员变量,局部变量)2.被final修饰后的类不可以被其它类继承3.被final修饰后的方法(函数)不可以被重写4.被final修饰后的变量(属性)不允许被再次赋值,final在对变量进行修饰时一定要赋值,被final修饰后的变量,我们称之为常量 定义常量:final 类型 大写常量名    =    常量值常量命名规范:字母全部要大写,如果这个名字由多个单词组成,单词之间用_隔开 public class Test{ publ

WMsg参数常量值

//WMsg参数常量值: //创建一个窗口 const int WM_CREATE = 0x01; //当一个窗口被破坏时发送 const int WM_DESTROY = 0x02; //移动一个窗口 const int WM_MOVE = 0x03; //改变一个窗口的大小 const int WM_SIZE = 0x05; //一个窗口被激活或失去激活状态 const int WM_ACTIVATE = 0x06; //一个窗口获得焦点 const int WM_SETFOCUS = 0x

【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息 /// 截获消息 处理XP不能关机问题 protected override void WndProc(ref Message message) { switch (message.Msg) { case WM_QUERYENDSESSION: isClosed = true; break; } base.WndProc(ref message); } #endregion window

Android基础入门教程——8.3.14 Paint几个枚举-常量值以及ShadowLayer阴影效果

Android基础入门教程--8.3.14 Paint几个枚举/常量值以及ShadowLayer阴影效果 标签(空格分隔): Android基础入门教程 本节引言: 在Android基础入门教程--8.3.1 三个绘图工具类详解Paint的方法参数那里我们就接触到 了这样几个东西:Paint.Style,Paint.Cap,Paint.Join等,这些都是Paint中的一些枚举值,相关 方法我们可以通过设置这些枚举值来设置特定效果比如:Style:画笔样式,Join图形结合方式等, 本节我们走进

Map生成器 map适配器现在可以使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象

Map生成器 map适配器现在可以使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象 package org.rui.collection2.map; /** * map生成器 * @author lenovo * */ public class Pair<K,V> { public final K key; public final V value; public Pair(K k,V v) { this.key=k; this.value=v; } }

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected override void WndProc(ref Message message)        {            switch (message.Msg)            {                case WM_QUERYENDSESSION: