Jump to content
troikasix

Tips Mempelajari C++

Recommended Posts

Berdasarkan buku: Effective C++ : Scott Meyers

C++ mempunyai pengikut yang paling ramai berbanding bahasa pengaturcaraan yang lain seolah2 terdapat kultus keagamaan fanatik terhadap bahasa ini. Ia adalah bahasa yang mampu mengeluarkan 'commercial grade' software berbanding bahasa lain dan selalu digelarkan sebagai Object Oriented Assembly Language.

Hari ini, C++ adalah bahasa pengaturcaraan pelbagai-paradigma, dengan kombinasi strukturan, orientasi objek, functional, generic dan metaprogramming. Keupayaan dan fleksibiliti ini menjadikan C++ satu alat yang tiada tara, tapi memeningkan kepala. Jadi bagaimana nak menguasainya?

Cara paling mudah adalah dengan melihat C++ bukan sebagai satu bahasa, tetapi gabungan pelbagai bahasa. Setiap sub-bahasa mempunyai undang2 tersendiri jadi lebih senang diingati. Apabila kita beranjak ke satu sub dari satu sub, maka undang2nya berubah. Untuk tak memeningkan kepala, anda mesti mengenalpasti pembahagian utamanya. Nasib baik cuma ada 4.

Rahsia penting disini adalah manahan diri daripada mengeksplor keterlaluan sehingga tersasar masuk ke sub-bahasa yang lain. Saya akan cuba menerangkan penggunaan sintaks dalam setiap sub-bahasa supaya anda boleh melihat perbezaan dan penggunaannya. Tapi mungkin saya akan tertinggal sedikit sebab saya pun baru nak faham juga.

Paradigma 1- C++ sebagai bahasa pengaturcaraan berstruktur C (structured language)

Asal usul C++ adalah dari bahasa C. Sampai ke satu tahap, C tak dapat nak dikembangkan lagi melainkan dengan sokongan platform sistem spt Windows & Linux. Semua pengkompil C++ adalah pengkompil C. Skop yang agak terhad tetapi sesuai utk proses pengenalan permulaan.

Ini adalah aliran yang paling mudah untuk dipelajari tapi paling susah untuk digunakan. Jangan buang masa lama sangat belajar di sini. Cukup sekadar untuk mengenali sintaks dan program flow bersama beberapa latihan. Tetapi luangkan masa untuk memahami topik `pointer`. Cuba fahamkan, kenapa kod yang berikut boleh dikompil.

struct Cell {
  int nRow,
  int nCol
};

Cell singlesel = {2,3};
unsigned int x = (void *)&singlesel;

Cell another = *(Cell*)(void*)x;
Hadkan diri anda kepada sintaks bahasa C struct, int, if, switch, case, for, do...while, return dsb nya. Ianya cukup sebagai panduan. Elakkan penggunaan sintaks class, virtual, template dan typename, juga semua jenis operator overloading. Untuk elak tersasar, gunakan file *.c dan *.h sahaja dalam peringkat ini. Paradigma 2- C++ sebagai bahasa berorientasi objek Kenali dan fahami konsep penting Abstraction, Polymorphism, Inheritance dan Encapsulation. (A-PIE). Anda boleh menggunakan Java sebagai platform mempelajarinya. Tetapi ia berakhir di situ. Java tak mampu pergi lebih jauh dari itu. Pastikan anda faham bahawa
int x;
adalah satu deklarasi objek. Bukan sekadar variable declaration. Ini maklumat penting untuk memahami apa itu sebenarnya objek dalam program anda. Dimana ia berada dan macammana untuk memanipulasikan objek. Belajar sikit pasal Assembly supaya anda faham kenapa this pointer wujud dan boleh digunakan dalam member function. Ia penting untuk memahami implikasi sintaks static kepada member function. Kenali multiple Inheritance dalam C++. Bandingkan ia dengan teknik interface dalam Java dan C#. Sintaks penting disini adalah class, virtual, operator, static dan struct. Elakkan sintaks template dan typename buat masa ini. Paradigma 3- C++ Template Metaprogramming (TMP) Ini adalah bahagian 'Generic' dalam C++, bahagian yang mana kebanyakan programmer kurang pendedahan dan pengalaman. Maklumlah, jika dilihat sampel kod, ia terlalu cryptic. Bukan mudah nak memahami cuma dengan cara membaca kod. Untuk walk-thru dalam debug mode pun tak tentu anda boleh kenalpasti apa yang berlaku. Tapi keupayaan paradigma ini tiada tandingan. Malah ia seolah-olah satu cabang yang amat besar. Memang boleh ditinggalkan terus sub-bahasa ini. Terang, Microsoft MFC hampir tiada mengguna cabang ini. Seingat saya cuma CArray dan beberapa yang lain. Tapi trend sekarang adalah TMP. Fahami dulu 23 teknik penyelesaian masalah dengan Design Pattern spt, Abstract Factory, Composit, Bridge, Observer, Iterator, Facade, Visitor dll. Gunakan Platform Java untuk tidak terlajak lebih jauh. Pelajari sintaks template dengan function dulu. Jangan terus lompat menggunakan sintaks
template<typename T >
class Foo{...};

Ia merbahaya kepada orang baru. Ingat, `function` baru `class`. Cuba kenalpasti perbezaan antara function template dgn class template. Apa yang boleh dan apa yang tak boleh.

Apabila sudah faham 2 perkara di atas, baru gunakan template base Design Pattern. Anda akan lebih menghargai template dengan cara ini. Bandingkan penggunaan C++ template dalam Design Pattern dengan implementasi Java.

Banyakkan membaca kod orang lain tentang template ini. Baca Microsoft punya ATL. Memang banyak magik (code [coklat ubat batuk]) diorang buat dengan template ni. Tapi teknik yang digunakan amatlah menarik. Saya nasihatkan, jangan tiru.

Warning!! Anda sekarang berada pada tahap 'no turning back' untuk menjadi Peminat Mati Keras ( Die hard fan ).

Paradigma 4- C++ Standard Library

STL adalah template base library. Tapi susunannya amat menarik. containers, iterators, algorithms, dan function bersatu dengan baik. Tak kenal maka tak cinta. Cari asal usul kewujudannya supaya dapat lebih menghargai library ni. Saya ada terbaca `White Paper` pertama cadangan STL. Memang best. Kalau saya jumpa link dia semula nanti, saya modify lagi tempat ni.

a- Mulakan dengan Container. (vector, list, ....)

b- Fahami Pointer Abstraction menggunakan Iterator.

c- Gunakan Algorithm dimana jua anda berada

d- Fahami teknik operator overloading dan kenapa ia sangat berguna.

e- Sambung pelajaran dengan Boost library pulak.

Tiada syntax yang dapat saya gariskan disini sbb semua dah abis dalam 3 paradigma sebelumnya.

Kesimpulannya

Bahasa C++ terlalu miskin. Tiada library GUI, tiada library CONTAINER seperti bahasa lain yang dikeluarkan dengan pelbagai jenis library. Java dgn swing, vb dgn form. Jadi usaha pengkayaan masih berterusan. Kalau nak tahu perkembangan terkini, lawatilah BOOST. Ia adalah platform ujian untuk pelbagai library baru yang sekiranya bersesuaian, akan dimasukkan ke dalam Std Library.

Diharap ini sedikit sebanyak membantu pada mereka yang baru kepada C++. Pastikan anda belajar mengikut urutan yang diberi.

- Ilmu yang paling penting disini adalah ilmu 'belajar untuk belajar' -

Wassalam.

Edited by xeonn

Share this post


Link to post
Share on other sites

thanks atas tips tersebut..

- Ilmu yang paling penting disini adalah ilmu 'belajar untuk belajar'.

kata2 yang bagus.. hehehe..

p/s: weh, ko terer pasal VB tak?

Share this post


Link to post
Share on other sites

Tak terer. Tahu sikit sikit jer sebab ada cuba gak. Tapi bila tengok, kod panjang menjela utk selesaikan satu masalah. Balik lagi ke C++. Tengok ni.

VB. Tak tahu betul ke tak. tapi seingatnya camni lah

'Declare
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cnn = new ADODB.Connection
Set rs = new ADODB.Connection

cnn.Open "[connection string]"
rs.Open "Select ID, Nama From Customer" cnn

SomeArray 'Declare array kat sini. Tak ingat camana

While rs.EOF = False

  SomeArray.ID = rs.Field(0)
  SomeArray.Nama = rs.Field(1)

  rs.MoveNext
Loop

rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
Bandingkan benda yang sama dalam C++
otl_connect cnn("Connectionstring");
 otl_stream istm (10, "Select ID, Nama from Customer", cnn);

 map<int, string> arr;
 int ID; string sNama;

 while( !istm.eof() )
 {
   istm >> ID >> sNama;
   arr[ID] = sNama;
 }

Declaration VB sahaja dah sampai 4 line (declare dgn set) compare dgn 2 C++. Camana nak kerja.

P/S OTL boleh amik kat http://otl.sourceforge.net

Edited by xeonn

Share this post


Link to post
Share on other sites

erk~! aku xfaham lasung apa coding tu.. noob lagik aku nie.. :ph34r:

Share this post


Link to post
Share on other sites

terima kasih banyak2 kepada xeonn sebab sudi berkongsi tips di atas. kalau boleh extend keempat2 paradigma tersebut dgn lebih panjang :) semoga lebih ramai yg berminat dgn c++ kat malaysia ni sebab c++ ni tak femes langsung berbanding php, vb/csharp.net.

satu lagi tips dari aku; kalau korang nak belajar konsep OOP dgn senang, aku masih tetap dgn pendirian aku, pegi download ruby.

Share this post


Link to post
Share on other sites

saya tak pernah pula dengar gelaran Object Oriented Assembly Language untuk C++, tapi sesungguhnya kita ada object oriented assembly language - java assembly dan .NET IL assembly. saya tak tahu status Parrot sekarang, dia pun ada assembly language juga :).

saya tak sure lah kenapa saya tak boleh tahan dengan C++. Terlalu sukar untuk otak saya menerima

cout << "Hello World"
(atau adakah ia cout >> "Hello World"??? saya sentiasa lupa!) tapi sepantas kilat otak saya dapat memahami
printf("Hello World");

Share this post


Link to post
Share on other sites

kalau boleh extend keempat2 paradigma tersebut dgn lebih panjang :) semoga lebih ramai yg berminat dgn c++ kat malaysia ni sebab c++ ni tak femes langsung berbanding php, vb/csharp.net.

Saya akan cuba sebaik mungkin betulkan post yang asal sbb gaya bahasa saya mmg susah org nak faham. Itu mmg kelemahan. Tapi post kat sini adalah Tips semata mata. Saya taknak spoil the fun. Saya lebih suka membakar semangat org.

Bagaimanapun trimas utk komen yang membina. Perbincangan adalah cara belajar yang paling berkesan. Lagipun 4 paradigma itu adalah pendapat semata-mata dari penulis buku Effective C++ : Scott Meyers. Dalam buku tu pun tak explain lebih lanjut kerana topik setiap satu terlalu besar.

Saya akan cuba buat post yang lain untuk memperkembang idea. Tapi bukan semua, kerana macam OO, sama konsepnya dlm bahasa pengaturcaraan yang lain.

satu lagi tips dari aku; kalau korang nak belajar konsep OOP dgn senang, aku masih tetap dgn pendirian aku, pegi download ruby.

Setuju. Saya tak tahu Ruby tu, tapi kalau itu mempermudahkan kenapa tidak.

Share this post


Link to post
Share on other sites

saya tak pernah pula dengar gelaran Object Oriented Assembly Language untuk C++, tapi sesungguhnya kita ada object oriented assembly language - java assembly dan .NET IL assembly. saya tak tahu status Parrot sekarang, dia pun ada assembly language juga :).

Terma 'Assembly' dah disalahguna pada zaman sekrg kerana nak mengaburi mata programmer. Java Assembly(Java Bytecode) dan .Net Assembly(Intermediate Language) bukan bermaksud 'Assembly' yang sebenar. Assembly language adalah satu bahasa pengaturcaraan yang paling dekat dengan bahasa binari. Malah ia tak perlu dikompil, cuma tukar semua perkataan kepada binari. Tengok ni http://www.xs4all.nl/~smit/asm01001.htm

saya tak sure lah kenapa saya tak boleh tahan dengan C++. Terlalu sukar untuk otak saya menerima

cout << "Hello World"

(atau adakah ia cout >> "Hello World"??? saya sentiasa lupa!)

tapi sepantas kilat otak saya dapat memahami

printf("Hello World");

Salah satu tujuan dalam C++ adalah untuk mempermudah penulisan kod. Mungkin ia terlalu mudah sampai org tak dapat menerima. Tengok kemampuan C++ ni yang tak ada pada bahasa lain.

class Duit{
int Ringgit; float Sen; 

void operator +=(int NewRinggit){ Ringgit += NewRinggit; }
void operator +=(float NewSen) { Sen += NewSen; }
};
//Bila kita dah overload operator += kat atas, objek kita boleh faham sendiri mana nak dicampur. Ringgit atau Sen menggunakan simbol += yang sama
Duit poket;
poket += 12; //poket.Ringgit == 12
poket += 0.20; //poket.Sen ==0.20
Dalam penggunaan << dan >> pula
int n = 2;
double dbl = 12.20;

cout << "Saya cuma ada " << n << " dalam poket" << endl << "Mak tambah " << dbl << " dah jadi " << (dbl + n) << endl;

//Bandingkan dengan
printf("Saya cuma ada %d dalam poket\n Mak tambah %.2f dah jadi %.2f", n, dbl, (dbl + n);
dengan << atau >> kita tak payah susah2 nak ingat samada variable tu double ka string ka int ka, cucuh suma ke <<. Biar C++ yang cari amenda jenis variable tu. Jadi lebih selamat dari bug yang tak kelihatan macam ni. (Cuba cari)
printf("Saya cuma ada %f dalam poket\n Mak tambah %.2f dah jadi %.2f", n, dbl, (dbl + n);

Sintaks C++ lebih asli dan selamat. Tapi itu semua bergantung samada anda orang asli atau tiruan. Mengenali nak guna samada >> atau << adalah proses pengenalan. Bila dah biasa, tak ada masalah.

"Saya seorang pemalas tulis Satu baris kod tapi jual dengan harga beribu ringgit. Nasib baik ada C++"

Edited by xeonn

Share this post


Link to post
Share on other sites

yap.. aku setuju.. c++ lebih mudah coding dari c. pasal << ngan >> tu senang jer aku nak ingat;

kalau nak masuk nilai, mesti tuju pada variable tu:

 
int i;
cout<<"Masuk Nilai :"; // kalau nak output, mesti tuju ke cout;
cin>>i;

kadang2 aku pon tersilap.. biasa ahh tu.. ;)

Edited by ApoNie

Share this post


Link to post
Share on other sites

c++ wit OOP...

lectr. buat pun x lepas.. abis2 time exam mati hafal code je walaupun mmg xbleh dicompile..

macamana tu.. hehe :P

Share this post


Link to post
Share on other sites

cout ngan cin .. ^_^

memori aku semester 2 nih..

aku amik calculus semester 2

cin ngan cout nih memula aku keliru gak..

last2 dapat teori sendiri

cin > hala ke dalam kertas [in]

cout < hala ke luar kertas [out]

huhuhuhu ^_^

Share this post


Link to post
Share on other sites

c++ wit OOP...

lectr. buat pun x lepas.. abis2 time exam mati hafal code je walaupun mmg xbleh dicompile..

macamana tu.. hehe :P

lecturer awak tu belajar bahasa c++ dan belajar bahasa pengaturcaraan tak susah mana pun, tapi apabila tak prektis sebagai programmer akan nampak la kesan buruknya kepada student.

anyway, C paling senang nak belajar sebab bahasa dia paling kecik, standard library dia pun sikit. tapi, kalau korang nak buat benda2 berguna dgn C, faham2 la.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...