`
shi5jin
  • 浏览: 37937 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

如何在类中定义常量?

阅读更多

如果你想得到一个可用于常量表达式中的常量,例如数组大小的定义,那么你有两种选择:

	class X {
static const int c1 = 7;
enum { c2 = 19 };

char v1[c1];
char v2[c2];

// ...
};
一眼望去,c1的定义似乎更加直截了当,但别忘了只有static const的整型或枚举型量才能如此初始化。这就很有局限性,例如:
	class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error not integral
};
我还是更喜欢玩“enum戏法”,因为这种定义可移植性好,而且不会引诱我去使用非标准的“类内初始化”扩展语法。

那么,为何要有这些不方便的限制?因为类通常声明在头文件中,而头文件往往被许多单 元所包含。但是,为了避免链接器设计的复杂化,C++要求每个对象都只能被定义一次。如果C++允许类内定义要作为对象被存在内存中的实体,那么这项要求 就无法满足了。关于C++设计时的一些折衷,参见《The Design and Evolution of C++》。

如果这个常量不需要被用于常量表达式,那么你的选择余地就比较大了:

	class Z {
static char* p; // initialize in definition
const int i; // initialize in constructor
public:
Z(int ii) :i(ii) { }
};

char* Z::p = "hello, there";
 
只有当static成员在类外被定义了,你才可以获取它的地址,例如:
	class AE {
// ...
public:
static const int c6 = 7;
static const int c7 = 31;
};

const int AE::c7; // definition

int f()
{
const int* p1 = &AE::c6; // error: c6 not an lvalue
const int* p2 = &AE::c7; // ok
// ...
}
原文地址:http://www.research.att.com/~bs/bs_faq2.html#in-class
分享到:
评论

相关推荐

    C# 定义常量 两种实现方法

    在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),...

    C语言中const定义常量

    本文将详细介绍如何在C语言中使用`const`关键字来定义常量,并探讨其背后的原理。 #### 二、`const`关键字概述 `const`关键字在C语言中用于声明常量,这意味着一旦被声明为`const`类型的变量赋值后,其值便不能再...

    C#箴言:定义常量的两种方法

    动态常量在运行时才被赋值,允许在类的构造函数中设置其值,提供了更大的灵活性。`readonly`常量就像类的其他成员一样,每个实例有自己的副本,因此不同的类对象可以有不同的`readonly`常量值。此外,`readonly`没有...

    在Python中定义一个常量的方法

    私有变量(以两个下划线开头)在类的外部不能直接访问,这有助于保护常量不被意外修改。然后,我们使用`@property`装饰器创建了一个名为`PI`的只读属性,这个属性可以让我们在不暴露私有变量的情况下获取`__pi`的值...

    我和LabVIEW(word版)——一个NI工程师十年的编程27在 LabVIEW 中使用常量定义.doc

    但是,在 LabVIEW 中定义常量的方法却是一个鲜为人知的 topic。本文将讨论在 LabVIEW 中定义常量的几种方法,并分析每种方法的优缺点。 首先,让我们回顾一下在 C 语言中定义常量的方法。在 C 语言中,我们可以使用...

    keil c51中变量 常量 函数的定位

    Keil C51 中变量、常量、函数的定位是指在编译器中将变量、常量、函数定位到某个特定的存储器地址上,以满足特定的应用需求。下面是 Keil C51 中变量、常量、函数定位的相关知识点: 一、代码定位 Keil C51 中有两...

    php常量用法类.zip

    主要介绍了php类常量用法,实例分析了php中类常量的概念、特性与相关使用技巧,需要的朋友可以参考下,类常量属于类自身,不属于对象实例,不能通过对象实例访问,子类可以重写父类中的常量,可以通过(parent::)来...

    C51常量 单片机C语言知识点

    C51语言数据类型在定义常量和变量时有着明确的应用方式和注意事项。首先,我们需要了解C51中定义常量和变量的数据类型以及使用方法。 常量是在程序执行过程中值不会发生变化的量,通常用来表示程序中不需变动的值,...

    议Java语言中常量定义的注意事项.pdf

    4. `static`关键字的使用:在类级别上定义常量,通常会与`final`一起使用,创建静态常量。这样,无论创建多少个类实例,常量都只有一个副本,节省内存资源。例如: ```java public class Constants { public ...

    TrueStudio for STM32 中常量定位到 Flash 方法

    在truestudio for stm32 IDE开发中如何定义常量到内部flash中。

    Java中的常量和变量概念及定义.docx

    - **成员变量**:成员变量是在类的外部声明但在任何方法之外声明的变量。它们自动具有默认值,如`int`类型的默认值为`0`,`double`类型的默认值为`0.0`,`String`类型的默认值为`null`等。 通过深入理解Java中的...

    静态定义常量

    java 定义静态常量

    java中定义常量方法介绍

    例如,`Math.PI`就是一个`static`常量,可以在类的任何地方访问,而无需创建`Math`类的实例。定义常量的语法如下: ```java public class Math { public static final double PI = 3.141592653589793; } ``` ...

    Vue中定义全局变量与常量的各种方式详解

    本文主要跟大家介绍了关于Vue定义全局变量与常量的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入...

    [C++中】const常量与define宏定义的区别

    在C++编程中,`const`常量与`#define`宏定义是两种常见的定义常量的方法,但它们之间存在显著的区别,这些区别主要体现在编译器处理方式、类型和安全检查、存储方式以及对程序效率的影响上。 ### 1. 编译器处理方式...

    JavaConstants:测试Java中常量的各种定义和使用方法

    定义常量的最常见方法是在类中使用public static final 。 然后,可以使用ClassName.CONSTANT_NAME在另一类中使用常量。 通常,通常在Java中至少以大写形式定义常量。 因此,如果我要为Pi(π)的值定义一个常量,...

    CODESYS之保持性变量和常量.doc

    在CODESYS中,如果你想声明一个不会改变的数值,你可以定义它为常量。一旦初始化,常量的值就不能再被修改,这有助于确保程序的稳定性和减少错误。在试图更改常量的值时,CODESYS会给出错误提示,防止这种操作的发生...

    C++中的常量定义小结

    本篇笔记总结自一次代码检视。 一般来说,使用C语言编程时我们都习惯在代码当中使用C...之前有所耳闻在C++中应该尽可能少的使用C风格的宏定义,这又是为什么呢? 在查找一些资料之后发现,对于减少C当中的宏定义的主

    php5.5中类级别的常量使用介绍

    当我们在代码中使用`use`语句引入别名或者在测试类中模拟对象时,`CLASS`常量就显得尤为重要。例如,在单元测试中,我们经常需要创建类的mock对象,如`$bar = $this->getMock('vendorpackageBar')`。如果我们使用`...

    使用类常量方式实现PHP枚举

    类常量是类的一部分,它们是静态的,不能被改变,且在类的整个生命周期内保持不变。声明类常量使用`const`关键字,语法如下: ```php class MyClass { const CONSTANT_NAME = 'constant_value'; } ``` ### 2. ...

Global site tag (gtag.js) - Google Analytics