2007-09-30

小结一下众高手的解答

关键字: 常见问题

最近我发的帖子在群里得到众多高手的细心指点,以及QQ群里热心的老大及时的在线解答和讨论,让我大有所获,故把的解答总结了一下。

1. 除了const,定义常量还有几种方法?
invariant/final/const

2.invariant/const/final 有什么区别?
 
invariant变量不能改变,任何能被invariant变量引用的数据也不能改变。只能用编译期常量来初始化

invariant变量,而且声明和初始化不能分开。invriant变量作为类的成员时不占用空间。

const变量本身不能改变,但数据可以被其它引用改变,其它跟 invariant 相同。

final变量的声明和初始化可以分开,如果在构造函数中,还可以被赋值多次。
http://www.digitalmars.com/d/final-const-invariant.html

3. C++中的引用,在D中怎么表示?如下C++代码,
int i;
int &j = i;
怎么转换成D?

对值类型没有显式引用,但可以用如下代码模拟:
alias i j;

4.
int test(T&); //T是一个类
int test(char&);
如何把这两个函数写成D的形式?

int test(T); //T是一个类
int test(ref char);

类类型默认就是引用

5. 怎么返回一个引用?
比如C++的函数:
string& copy(void);
该怎么写成D 的形式,我曾试图改成
ref string copy(void);
编译器报错

如果是函数要返回引用类型的话,要么用指针,要么把返回值用类包装一下,因为D中类类型总是引用

6. D中没有了sizeof运算符,那计算一个类的大小,该怎么办?
所有类型都有 .sizeof 属性

7. C/C++可以用malloc,new在堆中分配内存,D中对应的是什么呢?
class A
{
}
writefln(A.sizeof);
A pa = new A;

类是透明引用类型,不需要指针。 T obj = new T;

8.类的成员函数貌似只能在类里面定义,不能象C++可以在类的外面实现,是这样吗?
是的

7. in 象C++的默认传值调用,ref相当于C ++的引用,out比ref多了一点东西,就是在调用函数时out参

数都会被设置为默认值,我的理解对否?

D2.0中 in 暗含了 scope;out 是说参数只能写不能读,类似返回值的作用

9.类是透明引用类型,你的意思是D中对类类型默认是引用的,比如:
int test(T t);//T是一个类
这个函数调用是是用引用的吗?而不是象C++那样的传值调用
是的,跟java/C#相同

10. 既然out是只写的,而C++中用const修饰的形参是只读的,D中有没有类似的关键字呢?
比如如下代码:
class T
{
 int i;
};

int test(const T t)
{
         return 0;
}
如何改写成D的形式?

以上代码在D2.0中可以通过编译。此外,D 的 const 是一个storage class,而不是type modifier。

C++还可以用指针去掉const属性,在D中,它把const的变量都看成是ROM,这样真正变成了常量了。C++

中const的类变量是放在内存中的,可以通过指针修改,const只是用来哄编译器的语法糖而已。

11. 数组的dup是浅拷贝还是深拷贝?
浅拷贝:
import std.stdio;

class A
{
     int i = 0;
};

int main(char[][] args)
{

     A[] arrayA = new A[2];
    foreach(ref e; arrayA)
    {
        e = new A();
    }
    for(int i=0; i     {
          writefln(&arrayA[i]);
    }
    printf("\n");
    A[] arrayB = arrayA.dup;
    for(int i=0; i     {
          writefln(&arrayB[i]);
    }
   writefln();

   arrayA[0].i = 9;
   arrayB[0].i = 0;
   writefln(arrayA[0].i);

 return 0;
}
12. const数据可以被非const引用修改
import std.stdio;

class Integer
{
     public int i = 10;
};

int main(char[][] args)
{
     const int i = 10;
     int* j = cast(int*)&i;

     writefln("i = %d",i);
     *j = 20; //temp viriable modified, not the const i
     writefln("i = %d",i);

    const (Integer) si = new Integer();
    writefln("si = %d", si.i);

    Integer* sj = cast(Integer*)&si;
    sj.i = 20;   //modified successfully
    writefln("si = %d", si.i);
    return(0);
}

 

 感谢群里的高手细心的解答^_^

评论
soulmachine 2007-10-01
基本类型的常量都是在符号表中,修改的时候会在内存产生一个临时变量,修改的是这个变量,而不是原来的常量了。而类类型的常量需要分配内存,因而可以绕过修改,除非有操作系统的保护
beyking 2007-09-30
引用
12. const数据可以被非const引用修改
import std.stdio;
......
const int i = 10;
int* j = cast(int*)&i;

writefln("i = %d",i);
*j = 20; //temp viriable modified, not the const i
writefln("i = %d",i);


在dmd2.004里面测试了一下 修改不了i的数值的 i依旧是10
发表评论

您还没有登录,请登录后发表评论

soulmachine
  • 浏览: 53362 次
  • 性别: Icon_minigender_1
  • 来自: 湖北武汉
  • 详细资料
搜索本博客
我的相册
4dd10542-363e-3442-ab7a-6d72d1f607b7-thumb
黄鹤楼上.jpg
共 2 张
存档
最新评论