20.1 Pendahuluan
Setelah mempelajari dan memahami semua konsep yang dikemukakan dari bab 1 sampai 19, maka kini saatnya Anda melengkapi kemampuan C++ Anda dengan mengenai konsep tingkat lanjut yang bakal banyak Anda jumpai pada program-program riil. Dengan menyelesaikan dan memahami semua materi yang terdapat dalam buku ini, berarti Anda telah mempersiapkan diri Anda untuk menjadi seorang Master C + + , tentunya dengan latihan yang keras dan selalu berusaha untuk mengembangkan kemampuan Anda.
Pada bab ini akan dibahas mengenai topik-topik lanjut yang sering digunakan. Memang antara sub bab yang satu dengan yang lain di dalam bab ini sama sekali tidak memiliki hubungan, namun ini akan sangat bermanfaat bagi Anda dalam proses pengembangan program.
Pemrograman Bab 20: Topik Lanjut Lainnya
20.2 Fungsi Konversi
Dalam beberapa situasi, terkadang kita ingin menggunakan objek di dalam sebuah ekspresi dan memasukkannya ke dalam variabel dengan tipe data lain. Dalam keadaan normal, tentu hal ini tidak dapat dilakukan. Maka dari itu, untuk mengatasi masalah seperti ini, kita dapat melakukannya dengan salah satu cara, yaitu dengan menggunakan fungsi konversi. Melalui cara ini, sebuah objek dapat dianggap sebagai tipe data lain dan dapat digunakan sebagaimana layaknya tipe data tersebut. Sebuah fungsi konversi harus didefinisikan di dalam kelas yang akan dikonversi. Adapun bentuk umum dan pendefinisiannya adalah sebagai berikut:
Pada bentuk umum di atas, tipe_data adalah tipe data yang akan digunakan sebagai tujuan konversi, dan nilai_kembalian adalah nilai dari kelas setelah dilakukan proses konversi. Tipe data dari nilai_kembalian harus sama dengan tipe_data. Fungsi konversi hanya mengizinkan satu buah nilai kembalian, dan juga tidak boleh mengandung parameter. Meskipun demikian, fungsi konversi bisa saja bersifat virtual sehingga dapat di-override pada kelas-kelas turunan.
Untuk lebih memahami konsepnya, perhatikan contoh program di bawah ini dimana kita akan membuat sebuah kelas Stack yang dapat digunakan di dalam sebuah ekspresi bilangan bulat (integer).
Pada contoh ini, anggaplah kelas Stack yang akan kita buat hanya mampu menampung 10 buah nilai (item) bertipe int. Selanjutnya, apabila kita memasukkan tipe Stack ke dalam tipe int, maka tipe Stack tersebut akan mengembalikan jumlah nilai (item) yang saat ini ada di dalam stack. Berikut ini kode yang dimaksud.
Kode Program 20-1
Mnclude <iostream>
using namespace std;
const int MAX = 10;
class Stack { int A[MAX];
int atas;
Pemrograman C++
ablic:
Stack() {
atas = ! // jumlah stack mula-mula
// meletakkan sebuah nilai ke dalam stack void push(int nilai) {
if (atas == MAX) {
cout«" Stack penuh"«endl;
} else {
A[atas++] = nilai;
}
// mengambil sebuah nilai dari stack int pop() {
if (atas < 0) {
cout«"Stack kosong" «endl;
return 0;
} else {
return A[--atas];
// fungsi konversi dari tipe Stack ke tipe i operator int() {
return atas;
int main() { Stack ob;
int i, jumlah;
:for (i=0; i<6;
ob.push(i+l);
jumlah = ob; // konversi dari tipe Stack ke tipe int cout«"Jumlah maksimal stack : "«MAX«endl;
;cout«" Jumlah item yang telah diisikan : "«jumlah«endl, fcout«" Jumlah sisa ruang di dalam stack : ";
cout«MAX - jumlah«endl«endl;
// menampilkan isi stack cout«"Isi stack :"«endl;
for (i=0; i<6; i++) { cout«ob.pop () «" ";
return 0;
Bab 20: Topik Lanjut Lainnya
Hasil yang akan diberikan oleh program di atas adalah sebagai berikut:
Jumlah maksimal stack
Jumlah item yang telah diisikan Jumlah sis a ruang di dalam stack Isi stack :
6 5 4 3 2 1
: 10 :6 :4
Pada kode di atas tampak bahwa kita menuliskan kode berikut:
i = ob;
Kita mengetahui bahwa ob merupakan sebuah objek dari kelas Stack, sedangkan jumlah adalah variabel yang bertipe int.
Namun, dengan mendefinisikan fungsi konversi di atas maka kita dapat memasukkan nilai ob ke dalam variabel jumlah.
20.3 Mengenal const Member Function dan mutable
Dalam C+ + , fungsi-fungsi yang terdapat di dalam suatu kelas dapat dideklarasikan sebagai konstanta. Hal ini akan menyebabkan pointer this akan dijadikan sebagai pointer konstan. Dengan demikian, fungsi tersebut tidak diizinkan untuk melakukan perubahan terhadap data-data yang terdapat di dalam kelas bersangkutan. Untuk mendeklarasikan fungsi sebagai fungsi konstan, maka kita harus menggunakan kata kunci const di belakang nama fungsi bersangkutan. Berikut ini contoh program yang akan menunjukkan pendeklarasian fungsi konstan dan cara kerjanya. Sebagai catatan, pada saat kompilasi, program berikut akan menimbulkan kesalahan.
Kode Program 20-2
#include <iostream>
using namespace std;
Pemrograman
public:
void setx(int nilai}
x = nilai; // Sa int getx() const {
return x; // Benar
p = new Contoh;
p - > s e t x ( 3 ) ;
cout«"Nilai x di dalam kelas Contoh "«p->getx (
return 0
BMMHHMBMI
Perhatikan kode di dalam kelas Contoh, di situ terlihat bahwa kita mendeklarasikan dua buah fungsi konstan, yaitu s e t x ( ) dan getx ( ) . Pada saat kompilasi, kompiler akan memunculkan pesan error yang menyatakan bahwa fungsi s e t x ( ) adalah fungsi konstan sehingga tidak diperbolehkan untuk mengubah nilai x.
Sedangkan fungsi getx ( ) tetap bisa dijalankan karena didalamnya hanya memanggil nilai x.
Pada prakteknya, untuk kasus-kasus tertentu terkadang kita memerlukan beberapa buah fungsi di dalam suatu kelas yang dideklarasikan sebagai fungsi konstan. Terdapat suatu perkecualian, apabila kita memang benar-benar ingin mengubah data dari fungsi konstan, maka data tersebut harus dideklarasikan menggunakan kata kunci mutable. Perhatikan contoh program di bawah ini yang merupakan perbaikan dari contoh program sebelumnya.
Kode Program 20-3
^include <iostream>
using namespace std;
class Contoh { mutable int x;
publi C:
§ void s e t x ( i n t nilai) const {
Bab 20: Topik Lanjut Lainnya
x - nilai; // Bena int getx() const {
return x; // Benar
lilai x di dalam kelas Contoh : "«p->getx{
Kali ini, program dapat dijalankan karena x dideklarasikan sebagai mutable member. Jadi, kesimpulannya adalah kita dapat mengubah suatu data dalam suatu kelas dari fungsi konstan apabila data tersebut bersifat mutable. Hal ini sering dijumpai pada kasus dimana kita memiliki banyak data dalam suatu kelas yang seharusnya bersifat konstan, namun terdapat satu atau beberapa data lain yang memang dapat diperbaharui. Sebagai contoh, dalam kelas Karyawan, kita memiliki data konstan seperti NIP, nama dan umur serta sebuah data yang sewaktu-waktu dapat berubah, misalnya gaji. Dari kasus ini, kita dapat implementasikan ke dalam bentuk program seperti di bawah ini.
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
class Karyawan { private:
string NIP;
string nama;
short int umur;
mutable double gaji;
public:
void setNIP(string _NIP) { NIP = _NIP;:
Pemrograman
string getNlPO const { return NIP;
void setNama(string _nama) { nama = ,_nama ;
string getNama() const { return nama;
void setUmur(short int _umur) umur = __umur;
int getUmur() const { return umur;
void setGaji (double _gaji) const gaji = _gaji;
double getGaji return gaji;
const {
;
// Fungsi utama int main ( ) {
Karyawan obi , ob2 ;
obi . setNlP ( " 103 . Ill .0001"
obi . setNama ( "M . Aryoseno "
obl.setUmur(25) ;"
obi. setGaji (4000000) ;
cout«"NIP : "«obl.getNIP()«endl;
:cout«"Nama : "«obl.getNama( )«endl;
cout«"Umur : "«obl .getUmur (} «endl;
:cout«"Gaji : "«setprecision(8)«obl.getGaji ()«endl«enc Ob2 . setNIP ( "103 . Ill . 0002 ") ;
ob2 . setNama ( "Rizki Dwi Mulyana" ) ; ob2.setUmur(26) ;
ob2. setGaji (5000000) ;
cout«"NIP : "«ob2.getNIP()«endl;
cout«"Nama : "«ob2 ,getNama( ) «endl;
cout«"Umur : "«ob2 .getUmur ( )«endl;
cout«"Gaji : "«setpreci,sion(8)<<ob2.getGaji()«endl;
return 0;
Hasil yang akan diberikan oleh program di atas adalah sebagai berikut:
Bab 20: Topik Lanjut Lainnya
NIP :103.111.0001 Nama : M. Aryoseno Umur : 25
Gaji : 4000000
NIP :103.111.0001 Nama : Rizki Dwi Mulyana Umur : 26
Gaji : 5000000
Perhatikan kembali fungsi s e t G a j i O di atas. Fungsi tersebut dideklarasikan sebagai fungsi konstan, tujuannya adalah untuk meyakinkan bahwa fungsi tersebut tidak dapat melakukan modifikasi nilai terhadap data NIP, nama dan umur. Namun, karena fungsi s e t G a j i ( ) tersebut harus dapat mengubah nilai dari data gaji, maka data g a j i harus dideklarasikan sebagai mutable member.
20.4 Mengenal Copy Constructor
Selain constructor standar seperti yang telah kita bahas pada bab sebelumnya, dalam C + + juga dilengkapi dengan sebuah fitur untuk melakukan pembuatan copy constructor. Kegunaan dari copy constructor itu sendiri adalah untuk menginisialisasi suatu objek dari objek lainnya.
Pada saat kita menggunakan objek sebagai parameter fungsi (yang dilewatkan berdasarkan nilainya) dan sebagai nilai kembalian dari suatu fungsi, secara internal kompiler akan membuat objek baru lokal di dalam fungsi bersangkutan yang merupakan salinan (copy) dari objek yang dilewatkan tersebut. Proses penyalinan semacam ini sering dinamakan dengan bitwise copy. Meskipun bitwise copy dapat digunakan secara sempurna dalam banyak kasus, namun ada kalanya kita harus menghindari penggunaannya. Contoh yang paling umum mengapa kita harus menghindarinya adalah apabila di dalam constructor objek yang akan kita buat terdapat sebuah proses pengalokasian memori. Sebagai contoh, apabila terdapat Pemrograman C++
kelas dengan nama CONTOH yang harus mengalokasikan sebuah memori di dalam constructor-nya, dan terdapat sebuah objek A yang merupakan instance dari kelas tersebut. Ini artinya, objek A telah mengalokasikan sebuah rnemori. Selanjutnya, anggaplah bahwa objek A akan digunakan untuk melakukan inisialisasi terhadap objek baru B, yaitu dengan menggunakan kode berikut:
CONTOH B = A;
Apabila di sini kita menggunakan bitwise copy, maka objek B merupakan salinan pasti dari objek A. Artinya, objek B akan menggunakan bagian memori yang sama seperti yang sedang digunakan oleh objek A, dan tidak mengalokasikan ruang memori baru untuk keperluannya sendiri. Singkatnya, ini tidak sesuai dengan apa yang kita harapkan. Masalah lainnya adalah, apabila di dalam kelas CONTOH terdapat proses desctructor yang akan membebaskan ruang memori yang telah dipesan pada saat constructor objek. Hal ini tentu akan menyebabkan satu buah memori yang sama akan dibebaskan (free) sebanyak dua kali, yaitu pada saat destructor objek A dan destructor objek B, dan ini akan menjadi masalah yang serius.
Seperti yang sempat disinggung sebelumnya, masalah yang sama juga akan muncul pada saat kita menggunakan objek tersebut sebagai parameter atau nilai kembalian dari sebuah fungsi.
Untuk mengatasi masalah tersebut, C + + mengizinkan kita untuk membuat sebuah copy constructor, yang memiliki bentuk umum pembuatan seperti berikut:
nama_kelas (const nama_kelas &ob) { // Jbadan constructor
} WBwm
Di sini, ob adalah sebuah reference ke objek yang akan dijadikan sumber penyalinan (bukan objek tujuan) dalam proses inisialisasi.
Jadi apabila terdapat kode berikut:
CONTOH B = A; :,,,,;; ,-*v;f.. V
maka ob adalah sebuah reference yang mengacu ke objek A. Perlu sekali untuk dicatat bahwa parameter pertama dari sebuah copy constructor harus berupa reference ke objek. Meskipun demikian, kita dapat menambahkan parameter ke dalamnya sebagai parameter kedua, ketiga dan seterusnya, selama parameter tersebut memiliki nilai default.
Bab 20: Topik Lanjut Lainnya
Sebuah copy constructor akan dipanggil pada saat proses-proses yang merupakan inisialisasi. Sebagai contoh, apabila kita memiliki kelas CONTOH dan fungsi f unc ( ) , dan A adalah objek dari kelas tersebut, maka statemen-statemen berikut akan melakukan pemanggilan terhadap copy constructor.
Berikut ini contoh program sederhana yang akan menunjukkan bagaimana sebuah copy constructor bekerja.
class array { int *p;
int ukuran;
public:
// constructor default array(int _ukuran) {
try {
p = new int[_ukuran];
} catch (bad_alloc e) {
cout«"Alokasi memori gagal dilakukan' exit(EXIT_FAILURE);
fungsi untuk memasukkan nilai ke dalam array d iSiNilai{int indeks, int nilai)
f ((indeks < ukuran) && (nilai p[indeks] = nilai;
else {
cout«"Nilai gagal dimasukkan";
Pemrograman C++
// fungsi untuk mendapatkan nilai berdasarkan indeks int ambilNilai(int indeks) {
return p[indeks];
// definisi copy constructor array::array(const array &ob) {
int i ; try {
p = new int [ob.ukuran],-} catch (bad__alloc e) {
cout«"Alokasi memori gagal dilakukan' exit(EXIT_FAILURE);
// melakukan penyalinan isi array for (i=0; i < ob.ukuran; i++) {
p[i] = ob.p[i];
// Fungsi utama 4nt m a i n ( ) {
memanggil constructor default (standar)
// mengisikan nilai ke dalam array A for ( j = 0 ; j<10; j + + ) {
A.isiNilai ( j , j+1) ;
•// menampilkan nilai yang terdapat di dalam array A cout«"Nilai di dalam array A: "«endl;
for ( j = 0 ; j<10; j + + ) { cout«A. ambilNilai ( j ) «" " ;
cout«endl«endl ;
// melakukan inisialisasi terhadap array B menggunakan arr^
// A
array B(A); // memanggil copy constructor
// menampilkan nilai yang terdapat di dalam array B cout«"Nilai di dalam array B: "«endl;
for (j=0; j<10; j++) { cout«B. ambilNilai (j )«" " ; }
return 0;
Bab 20: Topik Lanjut Lainnya
i
Hasil yang akan diberikan adalah sebagai berikut:
Nilai di dalam array A:
1 2 3 4 5 6 7 8 9 1 0 Nilai di dalam array B:
1 2 3 4 5 6 7 8 9 1 0
Tampak jelas pada contoh program di atas bahwa kita melakukan penyalinan nilai dari objek A ke dalam objek B melalui sebuah copy contructor, yaitu dengan menuliskan kode berikut:
Ini artinya, pada saat copy constructor dipanggil, maka akan dialokasikan 10 buah ruang memori baru untuk tipe integer dan disimpan ke dalam pointer B.p (pointer milik objek B), dan semua nilai yang terdapat di dalam objek A akan disalin (di-copy) ke objek B. Dalam hal ini, objek A dan B akan berisi nilai yang sama, tapi sebenarnya masing-masing nilai dari kedua buah objek tersebut akan berada pada ruang memori yang terpisah. Dengan kata lain, pointer p milik dari objek A (A. p) dan pointer p milik dari objek B (B . p) tidak akan menunjuk ke alamat memori yang sama. Maka dari itu, apabila destructor dari objek A dipanggil maka hal ini tidak akan menyebabkan masalah terhadap objek B, begitu juga sebaliknya. Namun seandainya kita tidak membuat sebuah copy constructor, maka yang akan terjadi adalah proses bitwise copy sehingga A . p dan B. p akan menunjuk ke alamat memori yang sama.
Sebagai catatan terakhir yang perlu diingat adalah bahwa copy constructor tidak berlaku atau tidak akan dipanggil pada proses assignment. Sebagai contoh, perhatikan contoh kode berikut:
array A ( 1 0 ) ; I array B ( 1 0 ) ;
A = B; tidak akan memanggil copy constructor
Di sini, A B merupakan sebuah proses assignment, dan copy constructor tidak akan dipanggil. Artinya yang akan dilaksanakan adalah bitwise copy. Sebenarnya, untuk masalah seperti ini, apabila kita ingin memanggil copy constructor, maka kita harus melakukan overload terhadap operator = di dalam kelas bersangkutan.
Pemrograman
20.5 Mengenal Constructor Eksplisit
Menurut keadaan default, ketika kita melewatkan satu buah parameter pada constructor suatu kelas maka sebenarnya secara implisit kita melakukan konversi dari tipe data parameternya menjadi tipe kelas. Seperti yang telah dijelaskan pada bab sebelumnya dalam buku ini, bahwa kita dapat melakukan inisialisasi nilai dari sebuah objek (misalnya dengan nama ob) pada saat instansiasi melalui dua buah cara, yaitu dengan menuliskan o b ( x ) atau ob = x. Di sini, artinya secara implisit tipe dari variabel x akan dikonversi ke tipe kelas. Untuk lebih memahaminya, coba Anda perhatikan contoh program di bawah ini.
Kode Program 20-6
ttinclude <iostream>
using namespace std;
class contoh { int nilai;
public:
contoh(int x) int getNilai() {
return nilai;
int main(} {
contoh ob = 10; otomatis akan dikonversi ke contoh(10) cout«ob.getNilai () «endl;
return 0;
Di sini, constructor dari kelas contoh memiliki sebuah parameter yang bertipe int. Seperti yang dapat Anda lihat pada kode di atas bahwa kita dapat melakukan inisialisasi nilai terhadap objek ob dengan cara berikut:
contoh ob = 10; // bentuk
Ini artinya, secara implisit terjadi konversi dari tipe data parameter ke tipe kelas, yaitu dari tipe int ke tipe contoh. Pada saat kita menuliskan kode tersebut, sebenarnya secara otomatis kompiler
Bab 20: Topik Lanjut Lainnya
akan memanggil fungsi constructor contoh ( ) dengan melewatkan nilai 10 ke dalamnya. Dengan demikian, kode di atas akan sama bila dituliskan seperti berikut:
contoh ob(10); // bentuk kedua
Meskipun demikian, C + + mengizinkan kita untuk mematikan konversi otomatis tersebut sehingga kita hanya diperbolehkan menggunakan sintaks normal constructor (seperti yang terlihat pada bentuk kedua di atas). Adapun caranya adalah dengan mendeklarasikan constructor tersebut sebagai constructor eksplisit, yaitu dengan menambahkan kata kunci explicit di depan nama constructor bersangkutan. Berikut ini contoh program yang akan menunjukkan konsep constructor eksplisit.
Kode Program 20-7
// constructor eksplisit
explicit contoh(int x) : nilai(x) {
getNilai(}
2turn nilai
nt main() { contoh ob(10);
//contoh ob = 10;
cout«ob. getNilai return 0;
// Benar
// Salah, tidak diizinkan oleh kompilei
Tampak pada kode di atas bahwa dengan menambahkan kata kunci explicit di depan constructor, maka kita tidak dapat menuliskan instansiasi objek dengan menggunakan kode berikut:
contoh ob = 10;
Pemrograman
20.6 Membuat File Header
Pada prakteknya, apabila Anda kelak akan mengembangkan program menggunakan C+ + , tentu Anda akan bekerja dengan banyak file. Artinya, Anda tentu akan memecah fungsi-fungsi di dalam program yang Anda buat menjadi beberapa file terpisah sesuai dengan kategorinya. Fungsi-fungsi yang dituliskan dalam file lain ini biasa disebut dengan fungsi eksternal. Dalam C + + , file yang berisi fungsi-fungsi eksternal tersebut akan disimpan ke dalam file header (file yang memiliki ekstensi .h).
Sebelum kita memulai pembahasan mengenai cara pembuatan file header, perlu Anda ketahui terlebih dahulu bahwa C + + memiliki dua buah tipe language linkage, yaitu "C+ + " dan "C". Linkage "C"
digunakan apabila Anda akan membuat file header dengan menggunakan bahasa C, namun file tersebut akan digunakan atau dipanggil oleh program yang ditulis dalam bahasa C + + . Sedangkan linkage "C+ + " digunakan untuk pemanggilan kode C++ secara native, artinya file header dan program pemanggilnya sama-sama ditulis dalam bahasa C+ + . Penulisan linkage "C + + "
ini bersifat opsional (bisa disertakan, bisa juga tidak) karena secara default setiap kompiler C + + akan menganggap bahwa linkage yang digunakan adalah linkage "C+ + ". Untuk menggunakan linkage tersebut, kita harus menuliskan kata kunci extern di depannya.
Pada bagian ini kita akan mencoba untuk membuat dua buah file header, yaitu dengan menggunakan bahasa C dan C+ + . Sedangkan program pemanggilnya akan kita tulis dalam bahasa C + + . Hal ini bertujuan agar Anda benar-benar memahami perbedaan yang ada antara linkage " C" dan " C + +".
20.6.1 Menggunakan Bahasa C
Untuk membuat file header dengan menggunakan bahasa C, ikuti langkah-langkah berikut ini.
1. Buatlah file .h (misalnya dengan nama myheaderl .h) dan isikan contoh kode di bawah ini.
extern "C" int jumlah(int a, int b);
:extern "C" int kali(int a, int b);
extern "C" double bagi(double a, double b);
Bab 20: Topik Lanjut Lainnya
extern "C" void cetaklnteger(int nilai);
extern "C" void cetakDouble(double n i l a i ) ;
Buatlah file dengan nama myheaderl. c (sesuai dengan nama file yang kita buat pada Langkah 1), selanjutnya isikan kode di bawah ini.
#include <stdio.h>
extern "C" int jumlah(int a, int b) { return a + b;
jxtern "C" int kali(int a, int b) { return a * b;
extern "C" void cetaklnteger(int nilai) { printf("%d\n", nilai);
extern "C" void cetakDouble(double nilai) { printf("%.21f\n", nilai);
3. Lakukan kompilasi terhadap file myheaderl. c (bukan dijalankan).
Sampai di sini, kita sudah memperoleh file header yang siap untuk digunakan di dalam program. Sekarang, untuk melakukan pengujian terhadap file header yang baru saja kita buat di atas, buatlah contoh program pemanggil (dalam bahasa C + + ) , misalnya dengan nama mainl. cpp. Adapun kodenya adalah sebagai berikut:
Kode Program 20-8
#include <iostream>
#include "myheaderl.h" // menggunakan file-header myheaderl.h using namespace std;
int main() {
// menggunakan fungsi-fungsi di dalam file myheaderl.h int x = jumlahdO, 3);
int y = kali (10, 3 ) ; HHHHHHHHH Pemrograman
C-double = bagi(10, 3, // menampilkan hasil per.
cetaklnteger(x);
cetaklnteger(y cetakDouble(z return 0;
Hasil yang akan diperoleh adalah sebagai berikut:
13 30 3.33
20.6.2 Menggunakan Bahasa C++
Setelah mengetahui dan memahami bagaimana cara pembuatan file header dengan bahasa C, sekarang kita akan membahas tentang pembuatan file header dengan menggunakan bahasa C+ + . Adapun cara-caranya adalah sebagai berikut:
1. Buatlah kembali file .h (misalnya dengan nama myheader2 . h) dan isikan kode berikut ke dalamnya.
extern " C + + " int jumlah(int a, int b) ; extern " C + + " int kali (int a, int b) ;
extern "C++" double bagi (double a, double b) ; extern "C++" void cetak(int n i l a i ) ;
extern " C + + " void cetak (double nilai) ; u s
2. Buat file .cpp dengan nama myheader2 . cpp dan isikan kode seperti di bawah ini.
#include <iostream>
finclude <iomanip>
using namespace std;
extern "C++" int jumlah(int a, int b) { return a + b;
extern "C++" int kali (int a, int b) { return a * b;
extern "C++" double bagi (double a, double b) Bab 20: Topik Lanjut Lainnya
return a / b
extern "C++" voi cout«nilai«endl;
ext c
id cetak(double nilai) { ision ( 3 ) «showpoint«nilai«er
Lakukan kompilasi terhadap file myheader2 . cpp.
Selanjutnya, seperti biasa, buatlah sebuah program pemanggil (misalnya dengan nama main2 . cpp) yang akan menggunakan file myheader2 . h. Adapun contoh kodenya adalah sebagai berikut:
double z cetak(x);
cetak(y);
cetak(z);
return 0;
Hasil yang akan diberikan adalah sama seperti pada saat kita membuat file header dengan menggunakan bahasa C.
Seperti yang Anda lihat pada kedua buah contoh di atas, bahwa pada saat kita membuat file header dengan menggunakan bahasa C, maka yang digunakan adalah linkage "C". Begitu juga pada saat menggunakan bahasa C+ + , maka linkage yang digunakan adalah
"C+ + ".
Pemrograman C++