SORU
14 AĞUSTOS 2011, Pazar


Vs İşaretçiler Başvuruları ne zaman kullanılır

Ben işaretçiler karşı referans sözdizimi ve genel semantik, karar veremiyorum ne daha fazla veya daha az uygun bir API referans ya da işaretçi kullanmaktır ne zaman anladın?

Doğal olarak bazı durumlarda bir ya da diğer (operator ihtiyaçları bir referans değişkeni), ama genel olarak buluyorum ben tercih için kullanmak işaretçileri (ve sabit işaretçi) olarak sözdizimi net değişkenlerdir geçirilen yıkıcı.

E. g. aşağıdaki kodu

void add_one(int& n) { n  = 1; }
void add_one(int* const n) { *n  = 1; }
int main() {
  int a = 0;
  add_one(a); // not clear that a may be modified
  add_one(&a); // a is clearly being passed destructively
}

İşaretçi ile, bu kadar netlik büyük bir sorun olduğu API ve benzeri için neler işaretçiler, başvurular daha uygun her zaman (daha fazla) belli mi? Bu başvurular, sadece gerektiğinde kullanılan () örneğin operator olmalı anlamına mı geliyor? Biri ya da diğeri ile herhangi bir performans sorunları var mı?

DÜZENLE (ESKİ):

BOŞ değerlere izin ve ham dizileri ile uğraşan seçimi kişisel bir tercih aşağı gelir gibi görünüyor. Görünümü yoksa, ya da Google's C Style Guide, başvuran cevabı aşağıda kabul ettim "Başvurular değer sözdizimi ama işaretçi semantik olarak kafa karıştırıcı olabilir"..

DÜZENLEME:

Nedeniyle ek iş gerekli sterilize işaretçi değişkenler bu olmamalı NULL (örneğin add_one(0) arayın işaretçi sürümü ve mola sırasında çalışma zamanı), çok mantıklı bir bakış açısı idame için kullanmak başvurular bir nesne OLMALI mevcut, ama bu bir utanç kaybetmek sözdizimsel netlik.

CEVAP
14 AĞUSTOS 2011, Pazar


Sen nereye başvurmak gerekir, her yerde işaretçileri kullanın.

Edemezsin kadar işaretçiler kaçının.

Neden işaretçiler şeyler/okuma, diğer yapılar daha güvenli ve çok daha tehlikeli manipülasyonlar takip etmek daha zor hale.

Başparmak kuralı eğer diğer seçenek ise sadece işaretçileri kullanmak.

Örneğin, bir nesne için bir işaretçi döndüren işlevi bazı durumlarda nullptr iade edebilir ve edecektir kabul edilir zaman geçerli bir seçenek değildir. Bu daha iyi bir seçenek, bir şey boost::optional benzer kullanmak olacaktır dedi.

Başka bir örnek, belirli bir bellek uygulamaları için ham bellek işaretçileri kullanmak. Ve bütün kod tabanı tehlikeli parçalar sınırlamak amacıyla kod, çok dar yerlerinde gizli yerelleştirilmiş.

Örnek, çünkü argüman olarak bir işaretçi kullanarak nokta var

  1. eğer argüman olarak nullptr sağlarsanız, tanımsız davranış-toprak olacaksın;
  2. başvuru özniteliği sürümü kolay hileler nokta olmadan () 1 ile sorun izin vermez.
  3. öznitelik sürüm kullanıcı için anlaması daha kolay başvuru: geçerli bir nesne vermelidir, null olabilecek bir şey değil.

Eğer bu davranışın işlevi çalışmak ile veya olmadan, belirli bir nesne, daha sonra kullanarak bir işaretçi olarak öznitelik öneriyor iletebilirsiniz nullptr olarak bağımsız ve iyi işlevi. Kullanıcı ve uygulama arasında bir sözleşme sayılır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • EvilControllers

    EvilControll

    20 Ocak 2008
  • fufko

    fufko

    27 ŞUBAT 2006