[疑难] 两个小问题

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
Global site tag (gtag.js) - Google Analytics