`
hqs7636
  • 浏览: 220901 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

D 2.0 Const/Final/Invariant 概念简介

阅读更多
原文:http://oldrev.iteye.com/blog/105074

关键字: D2.0 D const final invariant constness
D 2.0 Const/Final/Invariant 概念简介

    D 2.0 specs 里的相关文档可读性不佳,因此我总结了一个简单的 const/final/invariant 概念简介,更详细的用法还请参考 D  2.0 specs。
    在2.0中,invariant 和 const 有作存储类、定义类型和定义成员函数三种用途,深刻地改变了D程序编写的方式,跟C++一样,使用const/final/invariant 需要更仔细地设计和编码,回报是提供了更好的类型安全性并能让编译器产生出更高效的代码。

这些 constness 特性,虽然看起来语法很复杂,但也比 C++ 的前后置 const 要容易理解记忆得多了,因为它不像 C++ 中的 const  定义那样存在很大的随意性。


1. invariant
1.1    invariant 作存储类(storage class)
    存储类是一个指定数据存储地点或方式的标志,static 就是一种存储类,用来要求编译器把数据存储到程序的静态存储区中。
    invariant 存储类定义一个真正的常量,这个常量决不能更改,甚至有可能是放在只读存储器中。因此,invariant 存储类定义的常量没有地址,编译器也会禁止任何的取地址行为。
    invariant 定义的常量只能使用初始化语法赋予初始值,如果 invariant 为引用/指针类型,那么所引用的数据也同样是 invariant 的。

1.2 invariant 作类型
    你可以用 invariant(TYPE) 的方法定义一个含有 invariant 属性的新类型,括号中的 TYPE 表示整个类型中适用于 invariant 的部分,比如: invariant(int)* ptr; 这行代码申明了一个指针变量 ptr,ptr本身是变量,但它所指向的类型 (int)是不可变的,因此 *ptr = 3; 这样的代码是一个语法错误。

1.3 invariant 成员函数
    invariant 可以用于修饰类和结构的成员函数,在 invariant 成员函数中传入的 this 指针/引用及其关联的任何东西都保证为 invariant。invariant 成员函数只能访问该类或结构的invariant 成员变量或其他 invariant 成员函数。
   

2. const
2.1 const 存储类
    const 存储类类似于 invariant 存储类,不同的是 const 定义的指针/引用所指向的数据可以是变量,因此它们可能会在其他地方被修改。

2.2 const 作类型
    与 invariant 作类型类似,const(TYPE) 定义一个含有 const 属性的新类型。不同点是当 const(TYPE) 作为指针/引用类型时,其所指向的类型可以是变量,如:int a; const(int)* ptr = &a; ptr 本身是变量,ptr 也可以指向变量,但是通过 ptr 只能只读地访问 a。


2.3 const 成员函数
    const 修饰的成员函数类似C++中函数声明后置的 const,表示他们不允许更改 "this" 指针/引用指向的对象数据。请注意这里的修辞,“不允许”意味着可以像C/C++一样用转型骗过编译器,不过欺骗编译器恐怕没什么好结果。与 invariant 成员函数类似,const 成员函数可以访问 invariant 和 const 成员变量和函数。

3. final 存储类

    final 存储类定义一个数据的访问模式为只读,与 invariant 不同的是,编译器为 final 定义的对象在内存中分配了空间。换句话来说,final 对象跟真正的变量没什么区别,只是由编译器来强制实施对此对象的只读访问。final 定义的对象可以用初始化语法初始化或在构造函数中初始化(加入 final 对象是类成员的话,当然,模块的this()也支持)。
    在成员函数方面,很早以前 final 已经用来表示禁止 override 了,final 也不能作为类型使用。


    目前 D 2.0 只是 alpha 版,还有很多的 bugs,因此,如果出现了任何不符合上面理论的问题,请怪罪编译器及其作者,而不是我,谢谢合作。
分享到:
评论
1 楼 hqs7636 2008-12-04  
比书上的好理解的多,特置顶

相关推荐

    iOS开发中关键字const/static/extern、UIKIT_EXTERN的区别和用法

    二、关键字const/static/extern/UIKIT_EXTERN的释义和用法 1、const 这个单词翻译成中文是“常量”的意思。在程序中我们知道“常量”的值是不能变的,固定的。所以const关键字的作用就呼之欲出了: (1)const...

    c/c++语言中const的用法,const 定义变量,指针的用法和不同

    在 C/C++ 语言中,const 关键字是一个非常重要的概念,它用于定义只读变量和常量。但是,const 的用法有一些细微的差别,容易让人感到困惑。在本文中,我们将详细介绍 C/C++ 语言中 const 的用法,包括 const 定义...

    详谈c++11 final与override说明符

    如下所示: //final,override出现在形参列表以及尾置返回...struct D:B{ void f1(int) const override ;//去掉const将出错,必须和基类中的函数原型一致,否则不能用override来表示覆盖 void f2(int) final;//fina

    Const,Const函数,Const变量,函数后面的Const.txt

    ### 关于Const、Const函数与Const变量的理解 在C++编程语言中,`const`关键字是一种类型限定符,被广泛用于提升代码的安全性与可读性。本文将深入探讨`const`的不同用法及其背后的原理。 #### 1. `const`修饰参数 ...

    C++中const用法全解

    const A* c = d; 3. 引用 const 常量初始化的情况:A f; const A& e = f; // 这样作 e 只能访问声明为 const 的函数,而不能访问一般的成员函数 5. const 在函数声明中的应用 const 可以修饰函数的返回值,或某个...

    C++/C 面试题 const

    在C++和C编程语言中,`const`关键字是一个非常重要的概念,它涉及到常量、常量指针、指针常量以及常量指针常量等多方面的知识。`const`关键字的主要作用是限制变量的修改,以提高程序的安全性和可读性。下面将详细...

    php中const与define的区别 具体归纳详细介绍

    // const MY_CONDITIONAL_CONST = 'Conditional Const'; // Invalid } ``` - **`define`**: 支持在条件语句中定义常量。 ```php if (true) { define('MY_CONDITIONAL_DEFINE', 'Conditional Define'); // ...

    C++函数后加const的意义 pdf

    #### 一、Const成员函数的基本概念 在C++编程中,`const`关键字有着非常重要的作用。特别是在类的成员函数中,`const`关键字可以用来表明某个成员函数不会修改类的数据成员。这种类型的成员函数被称为`const`成员...

    C语言中const使用说明

    在C语言中,`const`关键字是一个非常重要的概念,它用于定义常量或者声明只读变量。`const`的使用可以提升代码的可读性、安全性和效率,防止无意间修改不应变动的数据。本文将详细讲解`const`的多种用法和其在编程中...

    C++中const关键字详解

    在C++编程语言中,`const`关键字是一个非常重要的概念,它被广泛用于各种上下文中,以提高代码的安全性、可读性和效率。本文将详细介绍`const`关键字的用法及其在不同场景下的应用。 #### 二、`const`关键字的基本...

    const T vs. T const

    const T vs. T const 是在C语言及C++语言编程中非常重要的一个知识点,主要涉及const关键字如何与数据类型结合使用,以及它对变量或函数的限制。本文将详细探讨const关键字的用法,以及const在数据类型声明中的不同...

    c语言const的用法详解

    `const`关键字是C语言中的一个非常重要的概念,主要用于声明不可变的变量或指针。它可以帮助程序员更好地控制程序的行为,减少错误的发生,并提高代码的可读性和维护性。本文档通过一系列的例子详细介绍了`const`在...

    红黑树_ C++模板实现

    node* predecessor(const T&)const;//前驱 void preTraversal()const;//先根遍历 void inTraversal()const;//中根遍历 void destroy();//销毁红黑树 bool empty()const{return root == nil;}//判空 };

    const关键字使用总结

    ### C/C++中的`const`关键字详解 #### 一、`const`的作用 `const`关键字在C/C++中有着广泛的应用,它主要用于定义不可更改的变量或对象,以此提高程序的安全性和可维护性。 **1. 定义`const`常量** - **作用**...

    curfi.js:自动,快速,极简的曲线拟合工具,适用于浏览器和node.js

    const curfi = require ( "curfi" ) ; // create an instance of curfi let model = new curfi ( ) ; // dataset // xi, yi // 1, 0.5 // 2, 2.5 // 3, 2.0 // 4, 4.0 // 5, 3.5 // 6, 6.0 // 7, 5.5 let trainX =

    IOS 关键字const 、static、extern详解

    阅读别人的代码(一些优秀的源码)总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思的,但在概念上和具体的用法上却依然有些模糊,故特意整理汇总了下三个比较常见的关键字——const/static...

    c++中const关键字使用详解

    C++语言中的const关键字是一个非常重要的修饰符,它的核心作用是声明一个变量为常量,即不可修改。正确地理解和使用const,可以帮助提高程序的健壮性和安全性。本文将详细介绍const关键字在C++中的使用方法。 一、...

    类的static,const,static const,const static成员的初始化

    在 C++ 编程中,static、const、static const 和 const static 是四个常见的概念,但它们的初始化方式却容易弄混淆。下面我们将对这四种成员变量的初始化方式进行总结和解释。 1. 类里的 const 成员初始化 在一个...

    CONST用法

    在计算机编程领域,尤其是在C++中,`const`关键字是一个非常重要的概念,它能够帮助开发者在代码中定义不可更改的数据项,从而增强程序的安全性和可读性。本文将从多个角度深入探讨`const`的用法及其应用场景。 ###...

    const与static用法完整总结

    ### const与static用法完整总结 #### 一、const关键字详解 **1. 常量定义** 在C++中,`const`关键字用于声明一个常量或对象的一部分为不可变。例如: ```cpp const int max = 100; ``` 此处`max`被声明为一个...

Global site tag (gtag.js) - Google Analytics