Pengenalan C++ Modern


Salah satu matakuliah yang sering diajarkan pada semester-semester awal perkuliahan adalah pemograman C++.   Ini adalah tradisi yang dibawa sejak kurikulum tradisional hingga sekarang, dimana saat itu, bahasa yang lebih gampang seperti Java, Python, Ruby atau Groovy belum lahir.   Mengapa harus mengajarkan bahasa yang lebih sulit terlebih dahulu?   Mengapa tidak mulai mengubah tradisi lama dan menyesuaikannya dengan perkembangan zaman?   Sebagai perbandingan, banyak universitas di luar yang sudah mengadopsi Java sebagai bahasa yang diajarkan pertama kali.   Yang lebih memprihatinkan lagi adalah bahasa C++ yang diajarkan di beberapa kampus setempat tidak pernah di-update; saya masih menjumpai mereka yang memakai compiler Borland Turbo C++ yang jalan di DOS (kini sudah tidak diproduksi dan digantikan oleh seri produk C++Builder).

C++ adalah bahasa yang dikembangkan oleh Bjarne Stroustrup sejak tahun 1979.   Saat itu, tujuan utamanya adalah menambahkan fasilitas OOP pada bahasa C (C++ sebagai C With Classes).   Tapi Bjarne Stroustrup tidak diam saja hingga sekarang.   Ia dan anggota komite ISO lainnya terus memperbaharui standar bahasa C++ sehingga bahasa tersebut dapat bersaing dengan bahasa modern lainnya.   Standar terakhir adalah C++11 yang diterbitkan pada tahun 2011.   C++11 merupakan bahasa C++ yang sangat berbeda dari bahasa C++ versi sebelumnya sehingga ia kerap dikenal sebagai “Modern C++”.   Saat ini saya masih belum menjumpai universitas setempat yang mengajarkan Modern C++.

Microsoft Visual C++ di Visual Studio 2010 sudah mendukung C++11, walaupun masih terbatas.   Fitur C++11 terus ditingkatkan pada Visual Studo 2012 dan Visual Studio 2013.   Daftar fitur yang sudah dan belum di-implementasi-kan di Visual C++ dapat ditemukan di http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx.   Pada kesempatan ini, saya akan mencoba beberapa fitur C++11 di Visual C++ 2010.

Salah penambahan pada C++11 adalah rvalue reference.   Reference yang biasa seperti X& dapat menerima lvalue sementara itu const X& dapat menerima baik lvalue maupun rvalue.   C++11 menambahkan referensi yang hanya dapat menerima rvalue yang bentuknya seperti X&&.   Agar lebih jelas, perhatikan kode program berikut ini:

int a = 10; // pada ekspresi ini, a adalah contoh lvalue dan 10 adalah rvalue

int& t1 = a;  // hanya boleh mereferensi lvalue
int& t2 = 10; // !!ERROR!! karena tidak boleh mereferensi rvalue

const int& t3 = a; // boleh mereferensi lvalue
const int& t4 = 10; // boleh mereferensi rvalue

int&& t5 = a; // !!ERROR!! karena tidak boleh merefensi lvalue
int&& t6 = 10; // hanya boleh mereferensi rvalue

Dengan rvalue reference, seseorang dapat membuat move constructor atau move assignment dimana programmer kini dapat mengakses objek sementara.   Hal ini berguna untuk mengurangi duplikasi objek sehingga dapat meningkatkan kinerja pada objek yang menghabiskan banyak memori seperti vector.

Fitur lain di C++11 yang menarik adalah keyword auto dimana tipe data dapat ditentukan berdasarkan ekspresi, seperti pada contoh berikut ini:

...
#include <typeinfo>
...
auto x = 10;
auto y = "The Solid Snake";
auto z = 1.234;
printf("Tipe data x adalah %s\n", typeid(x).name());
printf("Tipe data y adalah %s\n", typeid(y).name());
printf("Tipe data z adalah %s\n", typeid(z).name());

// output:
// Tipe data x adalah int
// Tipe data y adalah char const *
// Tipe data z adalah double

Saya dapat menggunakan decltype (declared type) untuk memperoleh tipe data dari sebuah ekspresi di C++11, seperti yang terlihat pada contoh berikut ini:

auto x = 10;
decltype(x) y;
decltype(10*20.0) z;
printf("Tipe data y adalah %s\n", typeid(y).name());
printf("Tipe data z adalah %s\n", typeid(z).name());

// output:
// Tipe data x adalah int
// Tipe data y adalah char const *
// Tipe data z adalah double

C++11 juga memperkenalkan apa yang disebut sebagai lambda expression.   Ini adalah sebuah syntax yang mirip seperti anonymous function.   Contohnya terlihat pada kode program berikut ini:

template<typename Fn>
int proses(int angka1, int angka2, Fn operasi) {
	return operasi(angka1, angka2);
}

...

int hasiTambah = proses(10, 20, [](int a, int b) { return a + b; });
int hasilKali = proses(10, 20, [](int a, int b) { return a * b; });

Tambahan lain adalah adanya sebuah nilai untuk mewakili null pointer, yaitu nullptr.   Sebelumnya, sebuah null pointer selalu diwakili dengan angka 0.   Pada C++11, baik nullptr maupun angka 0 tetap mewakili null pointer seperti yang terlihat pada kode program berikut ini:

char* a = nullptr;
printf("a = %s\n", a);
char* b = 0;
printf("b = %s\n", b);

// output:
// a = (null)
// b = (null)

Sayang sekali fitur range-for loop untuk melakukan looping terhadap range masih belum di-implementasi-kan di Visual Studio 2010; fitur tersebut baru ada di Visual Studio 2012.   Contoh dari range-for loop adalah for (int& x: array) statement;.   Hampir semua bahasa modern sudah memiliki fasilitas serupa.

Tipe data baru yang diperkenalkan di C++11 adalah tipe data long long.   Penamaan ini dipakai untuk mewakili tipe data angka 64-bit. Contoh penggunaannya terlihat pada kode program berikut ini:

long x = 2147483648L;
long long y = 2147483648LL;
printf("%ld\n%lld\n", x, y);

// output:
// -2147483648
// 2147483648

Batas atas angka signed integer 32-bit adalah 2.147.483.647.   Tipe data long tidak dapat menampung lebih banyak lagi sehingga nilainya berputar kembali ke awal (menjadi negatif); sementara tipe data long long tidak mengalami masalah menampung angka ini (batas atas angka 64-bit adalah 9.223.372.036.854.775.807).

Perihal Solid Snake
I'm nothing...

One Response to Pengenalan C++ Modern

  1. Ping-balik: Memakai Collections Di C# | The Solid Snake

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: