SORU
11 ŞUBAT 2011, Cuma


'vs son s C 'in sabit Java

Java for C programmers tutorial (vurgu benim) diyor ki:

Anahtar kesindirkabaca C sabit eşdeğer

"Kabaca" demek bu bağlamda. Değillertam olarakaynı?

Varsa nelerdir?

CEVAP
11 ŞUBAT 2011, Cuma


C üyesi bir işaretleme işlevi const const örnekleri çağırdı olabilir anlamına gelir. Java bu bir eşdeğeri yok. E. g.:

class Foo {
public:
   void bar();
   void foo() const;
};

void test(const Foo& i) {
   i.foo(); //fine
   i.bar(); //error
}

Değerler, bir kez, Java, örneğin: daha sonra atanabilir

public class Foo {
   void bar() {
     final int a;
     a = 10;
   }
}

Java yasal, ama C ise değil

public class Foo {
   void bar() {
     final int a;
     a = 10;
     a = 11; // Not legal, a has already been assigned a value.
   }
}

Hem Java hem de C üyesi değişkenlerifinal/const sırasıyla olabilir. Bu sınıfın bir örneği inşa ediliyor bittikten sonra bir değer verilmesi gerekir.

Kurucu bitirmeden önce ayarlanması gerekir Java, bu iki yoldan biriyle elde edilebilir:

public class Foo {
   private final int a;
   private final int b = 11;
   public Foo() {
      a = 10;
   }
}

C başlatma listeler const üyeleri bir değer vermek için kullanmanız gerekir:

class Foo {
   const int a;
public:
   Foo() : a(10) {
      // Assignment here with = would not be legal
   }
};

Java son olmayan geçersiz kılınabilir gibi şeyler işaretlemek için kullanılabilir. C (pre-C 11) Bu yapmaz. E. g.:

public class Bar {
   public final void foo() {
   }
}

public class Error extends Bar {
   // Error in java, can't override
   public void foo() {
   }
}

Ama C :

class Bar {
public:
   virtual void foo() const {
   }
};

class Error: public Bar {
public:
   // Fine in C  
   virtual void foo() const {
   }
};

bu üye işaretleme semantiği const farklı işlev çünkü, gayet iyi. (Olabilir deaşırı yüküye fonksiyonları const tek alarak. (C 11 üye işlevler final, C 11 güncelleme bölümüne bakın) işaretli olmasını sağlar unutmayın


C 11 güncelleme:

C 11 aslında Java da aynı özellik için aynı semantiği ile final, sınıfları ve üye işlevlerini işaretlemek için Java örnek için izin verir:

public class Bar {
   public final void foo() {
   }
}

public class Error extends Bar {
   // Error in java, can't override
   public void foo() {
   }
}

Şimdi tam olarak C 11 olarak yazılabilir:

class Bar {
public:
  virtual void foo() final;
};

class Error : public Bar {
public:
  virtual void foo() final;
};

G 4.7 yayın öncesi bu örnek derlemek zorunda kaldım. Bu durumda const yerini almaz, ancak yerine, en yakın eşdeğer C kelime ile görülmemiş Java gibi davranışları sağlayan artırmaktadır unutmayın. Eğer öyleyse, eğer bir üye final const ikisi de işlevi varsa istediğini yaparsın:

class Bar {
public:
  virtual void foo() const final;
};

(const final burada gereklidir).

Daha önce fonksiyonlarıvirtual sigara yapma potansiyel bir seçenek de olsa, derleme zamanında bir hata vermeden olmaz const üye fonksiyonlar, doğrudan bir eşdeğer yoktu.

Aynı şekilde Java:

public final class Bar {
}

public class Error extends Bar {
}

C 11'de olur:

class Bar final {
};

class Error : public Bar {
};

(Daha önce private kurucular muhtemelen C bu sana en çok benzeyen kişiydi )

Devam ettirebilmek için ilginç bir şekilde, geriye doğru uyumluluk pre-C 11 kodu final iledeğilher zamanki gibi bir kelime. (C 98 önemsiz yasal örnek 41 ** bir anahtar sözcük yapma kodu kırmak niye

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • DanceOn

    DanceOn

    6 Mayıs 2006
  • Tube Time

    Tube Time

    14 Mayıs 2013