最近,我对学习D编程语言感兴趣。 (特别是D2,在撰写本文时是人们所指的,因为D原来现在处于维护模式以与现有代码兼容。)
在我决定是否使用C ++或D之前(我已经了解C ++,我对D一无所知),我想知道C ++有什么比D更好的?如果您在线阅读D,那么有很多材料只是简单地说“这里是C ++代码的一个例子,这里是D代码中的代码示例 - 看起来好得多”。当然,对于所示的例子,这当然是正确的。
某些差异可能受到意见的影响。例如,从派生类调用基类构造函数是由super()
(D)而不是<class name>(args)
在初始化列表(After :
表示法中)完成的。(C ++)。就个人而言,我不喜欢这个super
,但这只是我的意见,这是 不 我要问的问题。
更相关的是D不能支持多重继承。 (!)
iostream
/ ifstream
/ ofstream
操作?)例如,您可能想要在C ++中做的一件事情如下:
class base
{
}
class base_has_read_operation
{
public:
void read()
{
// complicated read function, 100000 lines of code...
}
virtual void do_read() = 0;
private;
// data
}
class base_has_write_operation
{
public:
void write()
{
// complicated write function, 100000 lines of code
}
virtual void do_write() = 0;
private:
// data
}
class reader : public base_has_read_operation
{
public:
void do_read()
{
read();
}
}
class writer : public base_has_write_operation
{
public:
void do_write()
{
write();
}
}
class read_writer : public base_has_read_operation, base_has_write_operation
{
public:
void do_read()
{
read();
}
void do_write()
{
write();
}
}
但可能没有多重继承你不能这样做吗?
答案 0 :(得分:4)
您的多继承问题可以使用模板mixin来解决,换句话说就是一段代码放入另一个代码中。例如:
interface IWriter {
void do_write();
}
// It is a template, you can specify compile-time arguments
mixin template Write() {
// complicated write function
}
interface IReader {
void do_read();
}
mixin template Read() {
// complicated read function
}
// D has multiple interface inheritance
class ReaderWriter : IWriter, IReader {
void do_write {
// You can do other things before...
mixin Write; // The code of Write is inserted here
// ...or after
}
void do_read {
mixin Read;
}
}
我可以说,如果你的ReaderWriter有一个读者和一个作者的句柄而不依赖于过度耦合多重继承,你肯定会更好。
答案 1 :(得分:1)
两个月前我从C ++转到D,所以也许我错了。
ref
限定符不替换C ++中的引用。特别是对于C ++ 11 rvalue引用和转发,你可以做很有效率的事情,比如只在必要时复制一个参数。 D我遇到问题的一个方面是引用和值类型。 C ++对此更加透明。
这使得编写有效代码变得困难。假设您有一些课程C!(T)
。您可能想要创建T
,但如果T
是一个类,则需要T t = new T(arg)
,否则T t = T(arg)
。我使用了mixin和T t = mixin((is (T == class) ? "new " : "") ~ "T(arg)");
一样。这相当丑陋。在这种情况下,我更喜欢C ++值对象。