小结一下众高手的解答
关键字: 常见问题最近我发的帖子在群里得到众多高手的细心指点,以及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);
}
感谢群里的高手细心的解答^_^
评论
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
发表评论
- 浏览: 53362 次
- 性别:

- 来自: 湖北武汉

- 详细资料
搜索本博客
我的相册
共 2 张
链接
最新评论
-
小结一下众高手的解答
基本类型的常量都是在符号表中,修改的时候会在内存产生一个临时变量,修改的是这个变 ...
-- by soulmachine -
小结一下众高手的解答
引用12. const数据可以被非const引用修改import std.std ...
-- by beyking -
争得好凶,不过过瘾!
设计!设计!好的分析和设计才最重要!
-- by RyanPoy -
高质量软件设计指南-C++/C ...
非常恶心的书,非常恶心的作者
-- by wdx04 -
使用netbeans 的五大理由
IDEA的生产率最高,不过5.5开始NetBean对jsf的支持实在很不错。
-- by fight_bird






评论排行榜