`
hqs7636
  • 浏览: 215572 次
  • 性别: 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...

    const用法 const int *a; int * const a;

    const char* pCh; // 指向字符串常量的指针; 表示pch是一个指针,指向字符串常量。根据需要还可以指向另一个字符串。 但字符串不能被改变。 char* const pCh; // 指向字符串的常量指针; 表示pch是一个字符串常...

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

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

    红黑树_ C++模板实现

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

    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++/C 面试题 const

    const C++/C 面试题 数据结构 面试题集共享啦

    stack-to-queue.rar_empty

    用二个顺序存储结构的栈,通过这二个栈的相关运算实现队列的以下功能。 Queue() //构造函数 bool empty() //返回队列是否已空 ...int retrieve(string &item) const //将队列头的值赋给item,成功返回0,否则返回-1

    一维动态数组实现的矩阵类

    CMatrix(const size_t& nrow, const size_t& ncol,const float* const pData); CMatrix(const size_t& nrow, const size_t& ncol,const int* const pData); //公开的成员函数 double At(const size_t& xr,const...

    自定义的矩阵类,内含源码与测试工程

    CMatrix(const size_t& nrow, const size_t& ncol,const float* const pData); CMatrix(const size_t& nrow, const size_t& ncol,const int* const pData); //公开的成员函数 double At(const size_t& xr,const...

    OAuth2.0-PHP:用于OAuth2.0实现PHP库

    OAuth2.0-PHP 用于OAuth2.0实现PHP库-Beta 1.0 当前的示例项目带有包含的库,无需任何特殊设置即可工作。 您可以使用随附的oAuth_2_0.json通过Postman测试创建的端点。 PHP版本> = 5.3 安装: 下载/克隆项目 将...

    PHP版QQ互联OAuth示例代码分享

    /** * QQ互联 oauth ... const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize'; //取Access Token Url const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token'; //取

    C++栈类模板

    void Push(const T &item;); //将元素item压入栈 T Pop(void); //将栈顶元素弹出栈 void ClearStack(void); T Peek(void)const; //访问栈顶元素 int StackEmpty(void)const; //测试是否栈满 int StackFull...

    https://chromium.googlesource.com/chromiumos/docs/+/master/const

    https://chromium.googlesource.com/chromiumos/docs/+/master/const

    c++语言CSV文件分割解析

    csv_parser(const char* begin, const char* end, char delimiter); // 字段数量 size_t size() const; // 字段数量是否为空,等价于 size() == 0 bool empty() const; // 返回第 index 个字段。避免拷贝构造...

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

    static,const,static const,const static是c++中几个常见的很容易弄混淆的几个概念,在这里总结了一下,与大家分享!

    C/C++中CONST用法总结(推荐)

    const int temp1; //temp1为常量,不可变  int const temp2; //temp2为常量,不可变 2、修饰指针时:  主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量; const int *ptr; //*ptr为常量...

    粒子系统简单框架实现

    const QUAT* GetOrientation(VOID) const; // 获得朝向 public: VOID Play(VOID); // 播放 VOID Stop(VOID); // 停止 VOID Pause(VOID); // 暂停 VOID Resume(VOID); // 继续 VOID Update(VOID); // 更新 ...

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

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

Global site tag (gtag.js) - Google Analytics