[疑难] 两个小问题
oldrev
2007-09-29
1. ref 唯一的用法就是描述函数参数,D 的形式为 string copy(),这里的 void 是瞎子戴眼镜。D数组可以看作是引用类型,也就是说arrayA = arrayB 只会执行浅拷贝
2. yep 3. 不完全正确,D2.0中 in 暗含了 scope;out 是说参数只能写不能读,类似返回值的作用 /****************************************/ 1. read the f**king doc: http://www.digitalmars.com/d/final-const-invariant.html 2. yep,你会 Java/C# 的话,这就很容易理解了。 |
|
soulmachine
2007-09-29
如果像你所说的,类类型在作为函数参数,函数返回值等等,都是用的引用,那跟java和C#就是一样的了,如此,问题1(上)和问题2(下)就解决了。
out原来是只能写不能读的意思啊,明白了,看来比ref限制更多。 既然out是只写的,而C++中用const修饰的形参是只读的,D中有没有类似的关键字呢? 为什么群共享里的那个d1011.chm没有http://www.digitalmars.com/d/final-const-invariant.html 这样的资料啊,怪不得我找不到 |
|
ideage
2007-09-29
建议看看D的中文文档,关于C/C++程序员如何用D编程的部分。
|
|
oldrev
2007-09-29
soulmachine 写道 如果像你所说的,类类型在作为函数参数,函数返回值等等,都是用的引用,那跟java和C#就是一样的了,如此,问题1(上)和问题2(下)就解决了。
out原来是只能写不能读的意思啊,明白了,看来比ref限制更多。 既然out是只写的,而C++中用const修饰的形参是只读的,D中有没有类似的关键字呢? 为什么群共享里的那个d1011.chm没有http://www.digitalmars.com/d/final-const-invariant.html 这样的资料啊,怪不得我找不到 1. const 2. D有1.0和2.0 之分 |
|
heroboy
2007-09-29
数组根本不是引用类型
int[] arr=[1,2,3]; int[] foo() { return arr; } void main() { int[] t = foo(); t[0]=0; t.length=10; writefln(arr); } 输出:[0,1,2] |
|
oldrev
2007-09-29
heroboy 写道 数组根本不是引用类型
int[] arr=[1,2,3]; int[] foo() { return arr; } void main() { int[] t = foo(); t[0]=0; t.length=10; writefln(arr); } 输出:[0,1,2] 输出[0,1,2]是不可能的,应该是[0,2,3] 再 t.length=10 之后,t就指向新数组了,而不是arr 对于一个 struct Array{T* ptr; size_t length; } 来说,只要赋值时执行浅拷贝,就可以看作引用类型 |
|
soulmachine
2007-09-29
输出结果的确是:[0,2,3] ,数组(包括静态数组,动态数组,关联数组吧?)的确可以看作引用,这样用法和C/C++差不多了.
TO oldrev: class T { int i; }; int test(const T t) { return 0; } 编译器报错-_- |
|
Colorful
2007-09-29
soulmachine 写道 输出结果的确是:[0,2,3] ,数组(包括静态数组,动态数组,关联数组吧?)的确可以看作引用,这样用法和C/C++差不多了.
TO oldrev: class T { int i; }; int test(const T t) { return 0; } 编译器报错-_- 我原来以为C++程序员转到D相当容易,看来我错了。 其实楼主的问题,D语言规范里面描述的相当清楚。 你的代码,我在DMD 2.004中是可以通过编译的,而且运行良好。它表达的语义比C++更加严格,完全只读,D编译器严格的强类型可以确保这点。而在C++中,我们做不到。 D 的 const 是一个storage class,而不是type modifier。因此,上面的用法,完全可以把const去掉。实际上,也很少有人在D中采用这样的用法。 在C++中,这样的用法表达t只读,不能被修改(我们可以采用指针欺骗编译器,绕过该限制)。 如果你要表达这样的语义,可以用这样的方式,当然,上面的方式在D 2.0中也完全可以。 const(T) t = new T(); 然后把t传给int test(T t). Btw,对于引用类型来说, 传值还是传引用,效果上是等价的。 |
|
soulmachine
2007-09-29
to Colorful:
const果然比C++强了啊。C++还可以用指针去掉const属性,在D中,它把const的变量都看成是ROM,这样真正变成了常量了。C++中const的类变量是放在内存中的,可以通过指针修改,const只是用来哄编译器的语法糖而已 |
|
oldrev
2007-09-29
soulmachine 写道 to Colorful:
const果然比C++强了啊。C++还可以用指针去掉const属性,在D中,它把const的变量都看成是ROM,这样真正变成了常量了。C++中const的类变量是放在内存中的,可以通过指针修改,const只是用来哄编译器的语法糖而已 不正确,真正的常量是 invariant 不分配内存,有可能保存在程序的只读节。const 是可以通过指针修改的。 三个关键字的不变性强弱为: invariant > const > final |
相关讨论
相关资源推荐
- workman:工人键盘布局
- 高效率键盘布局Workman
- Workman键盘布局
- workman安装以及使用
- 说说qwerty、dvorak、colemak三种键盘布局
- struts+ajax返回json数据类型的各种情形及对应的Demo
- ajax注解解决中文乱码,基于注解的简单MVC框架的实现,以及jquery,prototype,ajax传输乱码问题的一点解决方法...
- js获取URL参数以及Struts2与ajax json的交互
- prototype.js ajax.request,prototype.js之ajax.request学习笔记(一)
- struts2中使用JSON插件实现AJAX