Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

C++

Başlatan muhittin_kaplan, 26 Nisan 2014, 14:57:32

Gökhan BEKEN

#15
Alıntı yapılan: muhittin_kaplan - 26 Nisan 2014, 20:52:18
MgbClass cikis;        Mgbclas adında bir sınıf oluşturulmuş ve bu sınıftan cikis adında bir nesne yaratılmış.
Mevcut olan "MgbClass" adlı class'tan, "cikis" adlında bir nesne üretilmiş.


Alıntı yapılan: muhittin_kaplan - 26 Nisan 2014, 20:52:18
public:         //neden public sebep nedir
Bir değişkenin veya bir fonksiyonun başında "public" varsa, o fonksiyona veya değişkene, farklı bir class'tan ulaşılabilir.
"public" yerine "private" yazsaydık, o değişken ya da fonksiyona, sadece tanımlandığı class'ın içinden ulaşılabilecekti.
OOP dillerde, bunların dışında static, protected, extends şeklinde tanımlamalarda vardır, daha sonra değiniriz bunlara.



Alıntı yapılan: muhittin_kaplan - 26 Nisan 2014, 20:52:18
private: //buralar nedir
        uINT8 sari,turuncu,mavi,kirmizi;   
};
Bildiğiniz üzere uINT8 değişken türünü GenericTypeDefs.h dosyasında şu şekilde tanımlamıştık:
typedef unsigned char   uINT8;

o halde
uINT8 sari,turuncu,mavi,kirmizi;   

satırı ile unsigned char türünde 4 adet değişken oluşturuyoruz zaten sizin sorduğunuz kısım burası değil başındaki "private:" kısmı.
Yukarda bahsettiğim gibi private olarak tanımlanan değişken veya fonksiyonlara sadece o class'tan ulaşabiliyoruz.
Örneğin burdaki "sari" adlı değişkene "MgbClass" adlı class'ın içindeki  "MgbClass", "~MgbClass" "SariLedYak" ,"TuruncuLedYak","MaviLedYak","KirmiziLedYak" fonksiyonların herhangi birinden erişebilirim, zaten "MgbClass" adlı classtan erişmişim.
Ancak "main.cpp" dosyasından
cikis.sari=5
şeklinde erişemem, çünkü "sari" adlı değişken public değil private olarak tanımlandı.


Sizin sorularınızın dışında başka bilinmesi gerekenler de var. Aklıma gelenleri açıklıyorum.

        
MgbClass(); //constructor   yani hazirlik(yapici fonksiyon)
~MgbClass();    //destructor yani yikici fonksiyon


Constructor fonksiyonlar, classtan bir obje(nesne) yaratıldığı(hâşâ) pardon üretilmek istendiği zaman, nesne oluşturulmadan hemen önce kendi kendine çalışan fonksiyondur. Bu fonksiyonun içinde değişkenlere değer vermişiz. C++ dilinde constructor, class adı ile tanımlanır.
Destructor fonksiyonlar ise class'tan bir nesne yokedildileceği zaman, yok edilmeden hemen önce kendi kendine çalışan bir fonksiyondur. Bu fonksiyonun adı, class adının başına tilde(~) koyularak elde edilir.

Fonksiyon tanımlamalarında dikkat edeceğimiz bir husus var.
void MgbClass::SariLedYak(){}

Burda göreceğiniz üzere class adını yazdıktan sonra iki adet noktalıvirgül yazıp fonksiyon adını yazıyoruz. "MgbClass" adlı class'a ait "SariLedYak" adlı fonksiyonumuzu oluşturduk.

Önemli bir konu daha var. Bir "C" programında direkt fonksiyon adını yazıp içi doldurulabilir. Ancak "C++" programlarında bir fonksiyon tanımlamadan önce, o fonksiyonun prototipini yazmamız gerekir.
"mgbClass.h" adlı header dosyamızda, class'ımızın prototip'ini yazdık. Bu dosyada sadece tanımlamalar vardır. Hiç kod yazmadığımız için kim nereye bağlı rahatça okunabilir.
"mgbClass.h" adlı dosyamızı "main.cpp" dosyamızda include etmemiz, classı kullanabilmemiz için yeterli/gerekidir.
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan

class araba{

    public string model;
    public int uretimyili;
    public string renk;




}




mufitsozen

Alıntı yapılan: muhittin_kaplan - 26 Nisan 2014, 22:47:16
class araba{

    public string model;
    public int uretimyili;
    public string renk;
}


Rule 22
    Never specify public or protected member data in a class.

The use of public variables is discouraged for the following reasons:

    A public variable represents a violation of one of the basic principles of object-oriented programming, namely, encapsulation of data. For example, if there is a class of the type BankAccount, in which account_balance is a public variable, the value of this variable may be changed by any user of the class. However, if the variable has been declared private, its value may be changed only by the member functions of the class. [Not completely true. If a class has a member function which returns a reference to a data member, variables may be modified. This is avoided by following Rule 29.]
    An arbitrary function in a program can change public data which may lead to errors that are difficult to locate.
    If public data is avoided, its internal representation may be changed without users of the class having to modify their code. A principle of class design is to maintain the stability of the public interface of the class. The implementation of a class should not be a concern for its users.

The use of protected variables in a class are not recommended, since its variables become visible to its derived classes. The names of types or variables in a base class may then not be changed since the derived classes may depend on them. If a derived class, for some reason, must access data in its base class, one solution may be to make a special protected interface in the base class, containing functions which return private data. This solution would not imply any degradation of performance if the functions are defined inline.

The use of structs is also discouraged since these only contain public data. In interfaces with other languages (such as C), it may, however, be necessary to use structs.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

Hocam teşekkür ederim.

mufitsozen

Alıntı yapılan: muhittin_kaplan - 27 Nisan 2014, 00:47:31
Hocam teşekkür ederim.

Hocam tesekkur etmeye gerek yok. Vaktim olmadigi icin uzun uzun yazamiyorum ama C++ cok guclu ama cok buyuk ve cok karisik bir dildir. Dogru kullanilmamasi zor bulunan hatalara ve kotu tasaranmis sistemlere sebep olur. Bu yuzden basindan beri C++ kullanmakta cok basarili olan sirketler C++ kullanilmasini bir takim kurallara baglamislardir.

En bilinenlerden biri Ericsson AXE telefon santrallarinin yapimcisi Elemtel sirketinin kurallaridir.

Benim size gonderdigim alinti bu kilavuzdandir.

Daha guncel olan ise Google C++ Style Guide'dir http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Nesnenin oluşturulması ve yikilmasi demek, nesnenin oluşturulduğu hafiza alaninin serbest bırakılması manasına mi geliyor?
İkinci sorum da şu: nesnenin oluşturulması ve yikilmasi calişma zamanında olan işler dimi?(yani runtime da). Bu nesnelerin nerede(hangi memory adresinde) oluşturulacagina ne karar veriyor?yani hangi hafiza alanında olacagina.

yamak

Alıntı yapılan: mir_as82 - 27 Nisan 2014, 10:03:38
Nesnenin oluşturulması ve yikilmasi demek, nesnenin oluşturulduğu hafiza alaninin serbest bırakılması manasına mi geliyor?
İkinci sorum da şu: nesnenin oluşturulması ve yikilmasi calişma zamanında olan işler dimi?(yani runtime da). Bu nesnelerin nerede(hangi memory adresinde) oluşturulacagina ne karar veriyor?yani hangi hafiza alanında olacagina.
1.Evet Hocam nesnenin yıkılması demek nesnenin işgal ettiği hafıza alanının serbest bırakılması demek.
2.Nesnenin oluşturulması çalışma anında da olabilir derleme anında da.Yıkılması ise çalışma anında olur.
Nesneyi oluşturmadan önce o nesne türünden bir pointer tanımlanması gerekir.Tanımlanan pointer'ın sakladığı bellek adresine nesne yerleştirilir.Örneğin
Araba_Sinifi* araba1;

int main(void)
{
   araba1=new Araba_sinifi();
}

Mr.Java

Merakımdan soruyorum.Java ile bu chip'lere kodlar yazabiliyormuyuz ? Neticede Java C++'dan daha iyi hakim bellek yapısına.

yamak

Alıntı yapılan: Mr.Java - 27 Nisan 2014, 10:48:15
Merakımdan soruyorum.Java ile bu chip'lere kodlar yazabiliyormuyuz ? Neticede Java C++'dan daha iyi hakim bellek yapısına.
Evet yazılabiliyor.Ama Java'nın bellek yapısına daha iyi hakim olduğunu neye göre söylüyorsunuz.

Mr.Java

garbage collecter yapısından dolayı.

yamak

Eğer c++ kullanan programcı dikkatli ve iyi bir programcı ise garbage collecter a ihtiyacı olmaz ve bellek sızıntısı olmayan ve java'dan daha performanslı programlar yazabilir.

mufitsozen

javada garbage collecter olmasi bellek sizintisi olmayacagi anlamina gelmez. Dikkatsiz bir programci Javadada bellek sizintisi olan programlar yapmayi kolaylikla basarir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mr.Java

#27
Kısmen doğru.Peki ya sizin  hiç başınıza "segmentation fault" hatası  geldi mi?

İyi bir program,iyi bir bellek yapısı kullanımından geçer.C++ kullanıcısının dinamik bellek yönetimine iyi hakim olması gerekiyor.Çünkü bellek yönetimi tamamı ile coder'in eline bırakılmıştır. İşaretçiler ile istediğimiz gibi istediğimiz her yere erişebiliriz. Zaten sorunlara yol açan olaylar da tam olarak burada başlıyor. İstediğimiz yerlere erişiyoruz ama bazen de erişmememiz gereken bir yere erişme imkanı da veriyor bize. Hiç bir kontrol de yapılmıyor derleyici tarafından. Yani 'arkadaşım sen buraya erişmeye çalışıyorsun ama bak burası başkası tarafından kullanılıyor, ya da senin sınırlarının dışında.' gibi bir hata ile bizi uyarmıyor. İşi tamamen bizim bilincimize bırakmış durumda. Çok bilinçli kullanılması gereken bir bellek yönetimine sahip olmak gerekiyor.

Sözlükte durum güzel anlatılıyor.  :)

java sen dur ben hallederim. aman kurcalama bozarsın der.
c++ al abi elimdekiler bu ortam senin der. yarattırır...

java kullanarak gelistirdiginiz on dört bin siniftan olusan yazilim, yeri geldiginde hintli bir ekip tarafindan bir kac hafta icinde reengineer edilip, biraktiginiz yerden gelistirilebilir.

buna karsilik c++ kullanarak gece yatmadan evvel yazdiginiz kodu sabah kalktiginizda taniyamayabilirsiniz.

baska bir dille, c++ artik coder'liga tövbe etmis programcinin dilidir, java ise programcilik yillarini geride birakmis gelistiricinin. cünkü bir tanesiyle programlar yazarsiniz, digeriyle devasa projeler gelistirirsiniz.

Amacım tabi ki java üstün demek değildir.Çünkü programcı dil ayırt etmez..Fakat anlattıklarım işin gerçeği malesef.

mesaj birleştirme:: 27 Nisan 2014, 14:05:52

Alıntı yapılan: mufitsozen - 27 Nisan 2014, 13:45:05
javada garbage collecter olmasi bellek sizintisi olmayacagi anlamina gelmez. Dikkatsiz bir programci Javadada bellek sizintisi olan programlar yapmayi kolaylikla basarir.
Yazılımda işaretci(pointer) kullanarak dinamik olarak bellek ayırdıktan sonra o bellek ile işiniz bittiğinde mutlaka ayrılan belleği bellek yöneticiye özel metodlar yardımıyla(delete, destructor vs.) iade etmeniz gerekir. Yoksa bellek sızıntısı(Memory Leak) oluşur ve bu bir süre sonra yazılımın farklı davranmasına yol açar.

C veya C++'da Memory Leak saptanması çok zordur.

Garbage Collector sayesinde Java'da bir nesne oluşturulduktan sonra o nesne ile işiniz bittiğinde hiçbir şey yapmanız gerekmez. Sanal makine akıllı bir biçimde kullanılmayan bellek bölümlerini belirli aralıklarla ya da adaptif metodlarla sistemi otomatik olarak temizler ve sisteme iade eder.Garbage Collector sistemlerinin yapısı oldukça karmaşıktır fakat algoritması mükemmeldir. Garbage Collector'ün varlığı Java'da bellek sızıntısı olmayacağı anlamına gelmez, ama bellek sızıntıları daha ender olarak ve farklı şekillerde karsınıza cıkar ve genellikle tedavi edilmesi daha kolaydır.

muhittin_kaplan

ne yapalım şimdi, ben olsam c# a kickbox öğretir hepsini dövdürrüm.

konuya dönelim mümkünse, c++ bilmeyen birine bu dedikleriniz birşey ifade etmiyor.

Bu işe benimle devam etmek isteyenler Mümkünse Dev C++ ı kursunlar..



yamak

Alıntı yapılan: muhittin_kaplan - 27 Nisan 2014, 14:18:18
ne yapalım şimdi, ben olsam c# a kickbox öğretir hepsini dövdürrüm.

konuya dönelim mümkünse, c++ bilmeyen birine bu dedikleriniz birşey ifade etmiyor.

Bu işe benimle devam etmek isteyenler Mümkünse Dev C++ ı kursunlar..

Hocam bence Qt kurun daha zevkli bi şekilde code geliştirirsiniz.