PBO : TM 7

Nama : Riyn Winesdyo W.
Kelas : 02PPT
NIM : 1701292866

Kuis dan TM 7
Soal Pilihan
01. Inheritance kerap kali dihubungkan dengan polymorphism. Istilah yang paling
tepat untuk menyatakan inheritance sebagai polymorphism adalah
a.trivial polymorphism b. universal polymorphism
c. pure polymorphism d. subtype polymorphism

02. Meskipun mendukung penggunaan multiple inheritance tetapi penggunaan fitur
ini tidak dianjurkan di C++. Opsi berikut yang dianjurkan sebagai penggantinya
adalah
a. composition b. template
c. polymorphism d. overloading function

03. Salah satu kerugian penggunaan inheritance di OOP adalah
a. independensi di antara class dalam hirarki
b. independensi di antara object dalam hirarki
c. dependensi di antara class dalam hirarki
d. dependensi di antara object dalam hirarki

04. Tipe inheritance yang dianjurkan untuk melakukan derivation adalah
a. private b. protected
c. public d. private, protected dan public

05. ADT dan inheritance mempunyai komponen yang sama tetapi hanya beda strukturnya.
Paralel di ADT, hirarki di inheritance. Karena itu sejumlah inheritance mempunyai
kelebihan dibandingkan dengan ADT. Kelebihan-kelebihan itu diantaranya adalah
adalah adanya fitur-fitur bedrikut ini
a. reuse-ability dan extend ability
b. extend ability dan overriding function
c. overriding function dan reuse-ability
d. reuseability, extend ability dan overriding function

Soal Uraian

1. Apa yang salah dalam penggalan definisi class berikut:
class Time {
public: // prototype fungsi
private: int h = 0;
int m = 0;
int s = 0;
}

• Data member tidak boleh diinisialisasi secara langsung, tetapi boleh di dalam member function atau di dalam default constructor.
• Tidak ada tanda ‘;’ (titik-koma) untuk menutup class.

2. Jika Rasional adalah class bilangan rasional (pecahan seperti 22/7), apa beda ketiga pernyataan berikut:
Rasional y(x);
Rasional y = x;
Rasional y; y = x;

• Rasional y(x) dan Rasional y=x memanggil copy constructor karena belum diinisialisasi
• Rasional y; y=x memanggil assignment operator karena y telah diinisialisasi sebelumnya

3. Uraikan mengapa constructor dan destructor tidak diwariskan di C++ meskipun mereka kita deklarasikan dengan level akses public atau protected. Uraikan juga mengapa fungsi friend tidak diwariskan di klas turunan. Selanjutnya, sebutkan pula sejumlah fitur lain di klas induk yang tidak diwariskan di klas turunan.
• Destructor tidak diwariskan di C++ karena hal tersebut bukan bagian interface dari suatu class. Yang bisa diwariskan hanya interface dari class.
• Constructor tidak diwariskan karena setiap class hanya boleh punya 1 constructor.
• Friend function tidak diwariskan karena fungsi ini merupakan fungsi bebas yang artinya jika base class diwariskan pada inherited class tidak berarti friend function diwariskan pula. Selain itu friend function juga tidak boleh diwariskan karena melanggar konsep ’Information Hiding’

4. Konsep inheritance memunculkan fitur baru dalam C++ yaitu reuseability, dominating dan overriding. Jelaskan melalui penggalan kode, apa yang kamu ketahui tentang ketiga fitur tersebut.
• Reusability memungkinkan penggunaan kembali member dari base class di inherited class tanpa perlu membuat code dari awal.

class A{
protected:
	int x;
public:
	A(){x=0;}
	~A(){}
};

class B : public A{
protected:
	int y;
public:
	B(){y=1;}
	~B(){}
	void print(){cout<<x<<endl<<y;}
};

• Dominating berarti beberapa function member yang menggunakan nama sama akan didominasi oleh salah satu member function dan member function lainnya tertutup.

class A{
protected:
	int x;
	double z;
public:
	A(){x=0; z=2.00;}
	~A(){}
	void print(int ){cout<<x<<endl;}
	void print(int, double){
		cout<<x<<endl<<z<<endl;
	}
};

class B : public A{
protected:
	int y;
public:
	B(){y=1;}
	~B(){}
	void print(){cout<<x<<endl<<y;}
};

• Overriding berarti function member di inherited class menggunakan nama yang sama dengan member function di base classnya

class A{
protected:
	int x;
public:
	A(){x=0;}
	~A(){}
	void print(){cout<<x<<endl;}
};

class B : public A{
protected:
	int y;
public:
	B(){y=1;}
	~B(){}
	void print(){cout<<x<<endl<<y;}
};

5. Ilmu pengetahuan itu sifatnya kumulatif sehingga meskipun kita sudah mempunyai utilitas ADT yang tidak lain adalah enkapsulasi kita masih memerlukan inheritance. WHY? Untuk bisa menjawab kasus ini kamu harus membandingkan inheritance dengan ADT. Pertanyaan buat kamu adalah coba bandingkan inheritance dengan ADT dari berbagai sisi diantaranya dari sisi komponen, struktur komponen, advantage dan disadvantage.

Inheritance ADT
Komponen Data member, member function, constructor, copy constructor, destructor, access modifier Data member, member function, access modifier
Struktur komponen Turunan Paralel
Advantage Reusability, extendability, information hiding, overriding Modularity(independent), reuseability
Disadvantage Dependent Indepent

I AM PROUD AS BINUSIAN

PBO : TM 5

NAMA : Riyn Winesdyo W.
NIM : 1701292866
KELAS : 02PPT

Kuis dan TM 05

1. Opsi-opsi berikut adalah benar kecuali
a. const Time noon(12, 0, 0); b. int setData() const;
c. int getData() const; d. void print() const;

2. Dynamic array dideklarasikan mengggunakan metode berikut ini
a. int *x = new x[10]; b. int *x = new int[10];
c. int new *x = int[10]; d. int *x new = int[10];

3. Bilangan rasional adalah bilangan yang dapat ditulis dalam bentuk r = n/d di mana n dan d masing-masing adalah tipe data integer. Kita menyebutnya sebagai bilangan pecahan, n = pembilang dan d = penyebut. Untuk class Rasional, constructor initialization list dari konstruktor Rasional(int n, int m) {num = n; den = d; } adalah
a. Rasional (int n, int d) num (n), den (d) { }
b. Rasional (int n, int d) num (n); den (d) { }
c. Rasional (int n, int d) : num (n), den (d) { }
d. Rasional (int n, int d) : num (n); den (d) { }

4. Opsi-opsi berikut adalah salah kecuali
a. int& r = n; b. int& r = 44; c. int& r = n++; d. int&r = sqrt(n);

5. Model dynamic dalam OOP terjadi karena adanya interaksi antara
a. class dengan class b. class dengan object
c. object dengan class d. object dengan object

6. Banyak fungsi anggota class yang otomatis di-create oleh kompilator jika mereka tidak ditulis secara eksplisit oleh pemrogram adalah:
a. satu yaitu default konstruktor
b. dua yaitu default kosntruktor dan destructor
c. tiga yaitu default kosntruktor, copy konstruktor dan destructor
d. empat yaitu default kosntruktor, copy konstruktor, destructor dan overloaded assignment operator.

7. Fungsi-fungsi yang dapat diakses oleh object constant adalah :
a. constructor dan destructor
b. constructor dan fungsi anggota constant
c. destructor dan fungsi anggota constant
d. constructor, destructor dan fungsi anggota constant

8. Fungsi anggota yang didesain khusus untuk membantu tugas fungsi anggota lain suatu class disebut
a. friend function b. inline function
c. utility/helper function d. static function

9. Tipe data yang harus diinisialisasi adalah
a. const dan reference b. const dan pointer
c. reference dan pointer d. const, reference dan pointer

10. Arti dari function overloading di C++ adalah
a. fungsi dengan nama yang sama, isi fungsi sama, parameter sama
b. fungsi dengan nama yang sama, isi fungsi sama, parameter beda
c. fungsi dengan nama yang sama, isi fungsi beda, parameter sama
d. fungsi dengan nama yang sama, isi fungsi beda, parameter beda

11. Pernyataan const int * const x = &y; dibaca sebagai
a. x adalah konstanta pointer ke integer
b. x adalah pointer ke konstanta integer
c. x adalah pointer ke integer
d. x adalah konstanta pointer ke konstanta integer

12. Deklarasi yang menyatakan bahwa r adalah reference untuk n adalah
a. int& r = n; b. int r& = &n; c. int r& = n; d. int& r = &n;

13. Output dari penggalan program berikut

class Dosen {
public:
Dosen() {cout << “Constructor dosen diekseksi\n”}
~Dosen() {cout << “Destructor dosen diekseksi\n”}
};

void main() {
Dosen d0001;
cout << “Antarobject d0001 dan d0002\n”;
Dosen d0002;
}

adalah:
a. Constructor dosen dieksekusi
Constructor dosen dieksekusi
Antarobject d0001 dan d0002
Destructor dosen dieksekusi
Destructor dosen dieksekusi

b. Constructor dosen diekseksi
Destructor dosen dieksekusi
Antarobject d0001 dan d0002
Constructor dosen dieksekusi
Destructor dosen dieksekusi

c. Constructor dosen dieksekusi
Destructor dosen dieksekusi
Antarobject d0001 dan d0002
Destructor dosen dieksekusi
Constructor dosen dieksekusi

d. Constructor dosen diekseksi
Antarobject d001 dan d002
Constructor dosen dieksekusi
Destructor dosen dieksekusi
Destructor dosen dieksekusi

14. Untuk object global
a. konstruktor dipanggil sebelum eksekusi main() dan destruktor dipanggil sebelum eksekusi main()
b. konstruktor dipanggil sesudah eksekusi main() dan destruktor dipanggil sebelum eksekusi main()
c. konstruktor dipanggil sebelum eksekusi main() dan destruktor dipanggil sesudah eksekusi main()
d. konstruktor dipanggil sesudah eksekusi main() dan destruktor dipanggil sesudah eksekusi main()

II. Soal Uraian. (60 poin)

1. Seperti halnya tipe data yang dapat diberi modifier, maka fungsi juga dapat diberi modifier. Modifier yang berlaku pada fungsi adalah static, inline, const, friend dan virtual. Fungsi virtual akan kita pelajari secara ekstensif di polymorphism sehingga ia tidak kita bahas di soal ini. Jelaskan apa yang dimaksud dengan fungsi static, fungsi inline dan fungsi konstan . Jika perlu melalui contoh.

  • Fungsi static merupakan modifier yangg digunakan untuk mengakses class tanpa perlu membuat objek terlebih dahulu karena fungsi static tidak menempel pada objek tertentu tapi pada class. Fungsi static method tidak dapat mengakses suatu fungsi non-static.
    #include
    using namespace std;
    
    class Data{
    private:
    	static int angka;
    public:
    	void setAngka(int a){
    		angka=a;
    	}
    	static int getAngka(){
    		return angka;
    	}
    };
    
    int Data::angka=1;
    
    void main(){
    	cout<<"Angka : "<<Data::getAngka();
    	cin.get();
    }
  • Fungsi inline adalah fungsi yang digunakan untuk mempercepat eksekusi, tetapi memperbesar memori. Cara kerjanya adalah ketika ada pemanggilan suatu fungsi pada class dengan modifier inline, fungsi inline lah yang akan mencari pemanggilnya. Sedangkan fungsi biasa compiler akan membaca semua code secara terstruktur, ketika ada pemanggilan fungsi compiler akan kembali ke atas dan mencari fungsi yang sesuai. Fungsi ini disarankan hanya dipakai jika fungsi sering dipanggil, misalnya pada perulangan (while, for), dan ukurannya kecil.
    #include
    using namespace std;
    
    inline int multiply(int a, int b, int c){
    	return a=b*c;
    }
    
    int main(){
    	int a = 0;
    	int b = 1;
    	int c = 8;
    	for(b=1;b<=c;b++){
    		cout<<"a = "<< multiply(a, b, c)<<endl;;
    	}
    	cin.get();
    	return 0;
    }
  • Fungsi konstan adalah fungsi yang tidak dapat merubah data member objek.
    #include
    using namespace std;
    
    class Data{
    private:
    	int angka;
    public:
    	void setAngka(int a){
    		angka=a;
    	}
    	int getAngka(){
    		return angka;
    	}
    	void print()const{
    		cout<<"angka = "<<angka<<endl;
    	}
    
    };
    
    void main(){
    	Data obj;
    	obj.setAngka(12);
    	obj.print();
    	cin.get();
    }

2. Setiap fungsi anggota class mempunyai parameter tersembunyi yang disebut pointer this. Tipe pointer ini dapat diimplementasikan secara implisit dan eksplisit. Berikan dua contoh bagaimana kita mengimplementasikan pointer this secara implisit dan eksplisit.

#include
using namespace std;

class Data{
private:
	int angka;
public:
	Data(int = 0);

	void print()const{
		//secara implisit
		cout<<"angka         = "<<angka<<endl;

		//secara eksplisit menggunakan operator panah
		cout<angka   = "<angka<<endl;

		//secara eksplisit menggunakan dereferenced this pointer dan operator dot
		cout<<"(*this).angka = " <<(*this).angka<<endl;
	}
};

Data::Data(int value): angka(value){}

void main(){
	Data obj(12);
	obj.print();
	cin.get();
}

3. Diketahui penggalan kode berikut:
//The perfect shuffle for an even number of element:
void shuffle(int a[], int n) {
int temp[n];
for(int i= 0; i < n/2; i++) {
temp[2*i] = a[i];
temp[2*i+1] = a[n/2+i];
}
for(i=0; i<n; i++) a[i] = temp[i];}

Jika data masukan adalah (11, 22, 33, 44, 55, 66, 77, 88) apa keluaran dari kode tersebut. Menggunakan data terakhir ini, tulis fungsi main() sebagai driver untuk mengetes kode di atas.

hasil: (11, 55, 22, 66, 33, 77, 44, 88)

#include 
using namespace std;

void shuffle(int a[], int n){
int temp[8];
for(int i= 0; i < n/2; i++) {
	temp[2*i] = a[i];
	temp[2*i+1] = a[n/2+i];
}
for(int i=0; i<n; i++){
	a[i] = temp[i];
	cout<<a[i]<<endl;
	}
}

void main(){
	int a[]={11,22,33,44,55,66,77,88};
	int n=8;
	shuffle(a, n);
	cin.get();
}

4. Apa yang disebut variable reference? Bagaimana mendeklarasikan bahwa variable r adalah reference dari variable n. Selanjutnya, buatlah perbandingan head to head antara pass by value dan pass by reference. Perbandingan antara lain meliputi sintaks, parameter formal, parameter aktual, arah dan sifat passing dan sebagainya.

  • reference adalah nama sinonim atau alias dari variabel lain. Reference menyimpan adress dari suatu variabel. Reference di deklar menggunakan operator &.
    #include
    using namespace std;
    
    int main(){
    	int n = 1;
    	int &r = n;
    	cout<<"angka = "<<n<<endl;
    	cout<<"alias = "<<r<<endl;
    	n++;
    	cout<<"angka = "<<n<<endl;
    	cout<<"alias = "<<r<<endl;
    	r++;
    	cout<<"angka = "<<n<<endl;
    	cout<<"alias = "<<r<<endl;
    	cin.get();
    	return 0;
    }
  • Perbedaan pass by value dan pass by reference
    • Pass by value :
    – int x; Formal parameter x merupakan variabel lokal
    – Formal parameter merupakan duplikat dari actual parameter dan tidak dapat menggantikan actual parameter
    – Actual parameter bisa berupa constant, variable, maupun expression
    – Actual parameter hanya bisa membaca(read-only)
    – Pass by value lebih cocok untuk objek kecil yang tidak boleh diubah oleh function

    • Pass by Reference :
    – int *p; Formal parameter p merupakan pointer local
    – Formal parameter merupakan alamat dari actual parameter dan dapat mengubah actual parameter
    – Actual parameter harus berupa alamat dari suatu identifier
    – Actual parameter bersifat read-write
    – Pass by reference lebih cocok untuk objek yang boleh diubah oleh function

5. Berapa kali copy constructor dipanggil pada penggalan kode berikut. Uraikan jawaban Anda.
Widget f(Widget u) {
Widget v (u);
Widget w = v;
Return w;
}

main() {
Widget x;
Widget y = f(f(x));
}

jawab: sepuluh kali
1. Pertama didapat ketika widget x dijalankan
2. Kedua hingga keempat didapat ketika f(x) dijalankan
3. Kelima didapat ketika pemanggilan widget x di dalam f(x)
4. Keenam hingga kedelapan didapat ketika f(f(x)) dijalankan
5. Kesembilan didapat ketika pemanggilan widget x di dalam f(f(x))
6. Kesepuluh didapat ketika pemanggilan widget f(x) yg memiliki pengertian sama dengan widget x di dalam f(f(x))

-d1030-