文档章节

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

自由的角马
 自由的角马
发布于 2015/01/10 13:58
字数 1062
阅读 10
收藏 0


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

Java中常量的定义

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

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

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

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

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

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

    关于常量的这种定义和用法,相信做过Android开发的都会深有体会,AndroidR.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,类似于Javafinalconst的定义形式如下:

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



本文转载自:http://blog.csdn.net/luoweifu/article/details/29392511

自由的角马
粉丝 1
博文 269
码字总数 0
作品 0
文山
私信 提问
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米_思聪
2014/09/16
4.7K
0
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Java学习手册:Java基础知识点(不断扩充更新中)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/MaybeForever/article/details/89186089 1、Java学习手册:Java基础知...

浩比浩比
08/29
0
0
Scala学习(二)控制结构和函数

1.条件表达式 Scala的if/else语法结构和Java一样。不过,在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。例如: 或者将表达式的值赋值给变量: 这与如下语句的效果一...

我爱春天的毛毛雨
2018/09/30
13
0
C++不垃圾,只是Java很傲慢

《Thinking in C++》及《Thinking in Java》的作者Bruce Eckel向来是个“拥C++反Java”派,他曾经不止一次的提到,C++语言特性的添加有多么的深思熟虑,而Java又是如何的把一些奇怪的东西不停...

AlphaJay
2010/04/15
762
0

没有更多内容

加载失败,请刷新页面

加载更多

新架构、新角色:TiDB Community Upgrade!

作者:Jian Zhang 经过几年的发展,TiDB 社区已经逐渐成熟,但是随着社区的发展壮大,我们逐渐感受到了现在社区架构上的一些不足。经过一系列的思考和总结,我们决定升级和调整目前社区组织架...

TiDB
29分钟前
5
0
jquery qrcode库提示not function

jquery qrcode 这个库能用,但是必须在初始化的时候,官方给的使用方法是 引入qrcode的库文件后,在js中写以下 html <div id="qrcode"></div> js jQuery('#qrcode').qrcode({ render: ......

shikamaru
34分钟前
13
0
MySQL数据库去重的简单方案

利用 distinct 对需要处理的字段进行去重 select distinct 字段名 from 表名 利用group by select * from 表名 group by 字段名 利用having select * from 表名 group by 字段名 having 字段...

FeanLau
36分钟前
9
0
字符串转换成整数

实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该...

蔚蓝_晴天
48分钟前
8
0
Eureka客户端续约及服务端过期租约清理源码解析

在之前的文章:EurekaClient自动装配及启动流程解析中,我们提到了在构造DiscoveryClient时除了包含注册流程之外,还调度了一个心跳线程: scheduler.schedule( new Ti...

Java学习录
59分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部