Tải bản đầy đủ (.docx) (18 trang)

Cau hoi ly thuyet lap trinh huong doi tuong OOP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (198.09 KB, 18 trang )

CÂU HỎI LÝ THUYẾT
Câu 1: Trình bày khái niệm về đối tượng (object), lớp (class), thể hiện (instance),
thành phần dữ liệu (data member), phương thức (method), thông điệp (message).
Trả lời:
Một lớp là một bản mẫu mô tả các thông tin cấu trúc dữ liệu, lẫn các thao tác
hợp lệ của các phần tử dữ liệu. Khi một phần tử dữ liệu được khai báo là phần tử của
một lớp thì nó được gọi là một đối tượng (Object). Các hàm được định nghĩa hợp lệ
trong một lớp được gọi là các phương thức (Method) và chúng là các hàm duy nhất
có thể xử lý dữ liệu của các đối tượng của lớp đó. Một thể hiện (Instance) là một vật
thể có thực bên trong bộ nhớ, thực chất đó là một đối tượng (nghĩa là một đối tượng
được cấp phát vùng nhớ).
Thành phần dữ liệu (data member) hay còn gọi là dữ liệu thành viên của lớp là
các dữ liệu thể hiện các thuộc tính đặc trưng của một lớp. Các phương thức định
nghĩa trong một lớp có thể được gọi bởi các đối tượng của lớp đó. Điều này được gọi
là gửi một thông điệp (Message) cho đối tượng. Các thông điệp này phụ thuộc vào
đối tượng, chỉ đối tượng nào nhận thông điệp mới phải làm việc theo thơng điệp đó.
Các đối tượng đều độc lập với nhau vì vậy các thay đổi trên các biến thể hiện của đối
tượng này khơng ảnh hưởng gì trên các biến thể hiện của các đối tượng khác và việc
gửi thông điệp cho một đối tượng này khơng ảnh hưởng gì đến các đối tượng khác.
Câu 2: Trình bày các tốn tử xác định phạm vi lớp và truy cập tới các thành viên. Ví
dụ minh hoạ?
Trả lời:
Tốn tử định phạm vi “::” được dùng trong các định nghĩa hàm của các phương
thức trong các lớp, để khai báo lớp chủ của các phương thức đang được định nghĩa
đó. Tốn tử định phạm vi cịn có thể được dùng để phân biệt các thành phần trùng tên
của các lớp cơ sở khác nhau.
Các toán tử được sử dụng để truy cập các thành viên của lớp được đồng nhất với
các toán tử sử dụng để truy cập các thành viên của cấu trúc. Toán tử lựa chọn thành
viên dấu chấm (.) được kết hợp với một tên của đối tượng hay với một tham chiếu tới
một đối tượng để truy cập các thành viên của đối tượng. Toán tử lựa chọn thành viên



mũi tên (->)được kết hợp với một con trỏ trỏ tới một truy cập để truy cập các thành
viên của đối tượng.
VD:
#include <iostream>
using namespace std;
class connguoi
{
public:
string hoten;
int tuoi;
public:
void set();
};
void connguoi :: set()
{
cout << "Nhap Ho Ten: ";
fflush(stdin); // Xóa bộ đệm
getline(cin, this->hoten);

}

cout << "Nhap Tuoi: ";
cin >> this->tuoi;

int main()
{
connguoi obj; // Khai báo obj là 1 đối tượng trong lớp connguoi
obj.set();


}

cout << "Ho Ten: " << obj.hoten << endl;
cout << "Tuoi: " << obj.tuoi << endl;
return 0;

Phạm vi truy cập là cách mà người lập trình quy định về quyền được truy xuất
đến các thành phần của lớp.
Trong C++ có 3 loại phạm vi chính là: private, protected, public
− public: Khơng hạn chế. Thành phần có thuộc tính này có thể được truy

cập ở bất kì vị trí nào.
− private: Thành phần có thuộc tính này sẽ chỉ được truy cập từ bên trong
lớp. Bên ngoài lớp hay trong lớp dẫn xuất sẽ không thể truy cập được.
− protected: Mở rộng hơn private một chút. Thành phần có thuộc tính này
sẽ có thể truy cập ở trong nội bộ lớp và trong lớp dẫn xuất


Câu 3: Trình bày khái niệm về hàm khởi tạo, hàm huỷ, các tính chất. Ví dụ minh
hoạ?
Trả lời:
Hàm khởi tạo là một hàm thành viên đặc biệt của một lớp. Nó sẽ được tự động
gọi đến khi một đối tượng của lớp đó được khởi tạo.
Một hàm tạo sẽ khác những hàm thơng thường ở những điểm sau:


Có tên trùng với tên lớp




Khơng có kiểu dữ liệu trả về ( kể cả kiểu void)



Tự động được gọi khi một đối tượng thuộc lớp được tạo ra



Nếu chúng ta khơng khai báo một hàm tạo, trình biên dịch C++ sẽ tự động
tạo một hàm tạo mặc định cho chúng ta (sẽ là hàm khơng có tham số nào và
có phần thân trống).

Hàm khởi tạo về cơ bản sẽ được chia làm 3 loại:
1. Hàm khởi tạo không tham số
2. Hàm khởi tạo có tham số

VD1:
class sinhvien
{
private:
string ten;
int tuoi;
public:
sinhvien() //ham khoi tao khong co tham so
{
this->ten = "";
this->tuoi = 0;
}
sinhvien(string ten, int tuoi) // ham tao co tham so
{

this->ten = ten;
this->tuoi = tuoi;
}
};

3.

Hàm khởi tạo sao chép: Khi nào cần dùng hàm tạo sao chép?: Khi trong
lớp có thuộc tính con trỏ hoặc tham chiếu.

VD2:
Class DT
{
private:
int n;

//Bac cua da thuc


double *a;
public:
DT u;
DT v(u); //Khi đó hai con trỏ u.a và v.a cùng trỏ đến một vùng nhớ.
};
DT::DT(const DT &d)
{
this->n = d.n;
this->a = new double[d.n+1];
for (int i=0;i<=d.n;++i)
this->a[i] = d.a[i];

}

Hàm huỷ cũng là một hàm thành viên đặc biệt giống như hàm tạo, được dùng
để hủy bỏ, giải phóng các đối tượng khi nó hết phạm vi tồn tại.
Hàm hủy:
-

Khơng có đối số
Khơng có giá trị trả về
Khơng định nghĩa lại
Trùng tên với lớp và có dấu ~ ở trước
Thực hiện một số cơng việ trước khi hệ thống giải phóng bộ nhớ
Chương trình dich tư động sinh hàm hủy mặc định

VD3:
public:
~DT()
{
this->n=0;
delete this->a;
}

Câu 4: Trình bày khái niệm về nạp chồng tốn tử, cho ví dụ minh hoạ?
Trả lời:
Nạp chồng tốn tử (Operator Overloading) được dùng để định nghĩa toán tử
cho có sẵn trong c++ phục vụ cho dữ liệu riêng do người dùng tạo ra.
Các toán tử: *, / , +, -, <<, >>, ….
VD: Xây dựng lớp phân số. Nạp chồng toán tử + để cộng hai phân số.
class phanso
{

int ts,ms;
public:
phanso operator +(phanso p);
};
...
phanso phanso::operator+(phanso p)


{
phanso kq;
kq.ts=ts*p.ms+ms*p.ts;
kq.ms=ms*p.ms;
return kq;
}

Câu 5: Trình bày khái niệm về các thành viên tĩnh (static) của lớp, cho VD minh
hoạ?
Trả lời:
Khi khai báo một thành viên là static, khi đó chỉ có một địa chỉ ơ nhớ được truy
cập. Khi khởi tạo một đối tượng, thành phần static sẽ được lưu giá trị của đối tượng
trước đó. Các thành viên static được truy cập thông qua tên lớp. Các biến static đôi
khi được gọi là class variables, class fields, hoặc class-wide fields bởi vì chúng
khơng phải là biến của đối tượng mà tồn tại theo lớp.
VD:
// Lop HDBH (hoa don ban hang)
#include <conio.h>
#include <iostream>
using namspace std;
class HDBH
{

private:
int shd ;
char *tenhang ;
double tienban ;
static int tshd ;
static double tstienban ;
public:
static void in()
{
cout <<"\n" << tshd;
cout <<"\n" << tstienban;
}
};
int HDBH::tshd=5;
double HDBH::tstienban=20000.0;
void main()
{
HDBH::in();
getch();
}

 Kết quả:
5
20000


Câu 6: Khái niệm về tính kế thừa, tính chất. Nêu ví dụ minh hoạ?
Trả lời:
• Kế thừa là khả năng cho phép xây dựng một lớp mới:
▫ Được thừa hưởng các thành phần từ một hay nhiều lớp đã có (lớp cơ sở).

▫ Trong lớp ta có thể bổ sung thêm các thành phần hoặc định nghĩa lại các thành phần

Đặc tính của kế thừa



– Cho phép định nghĩa lớp mới từ lớp đã có, khi đó:


Lớp mới được gọi là lớp con (subclass) hay lớp dẫn xuất (derived class).



Lớp ban đầu gọi là lớp cha (superclass) hay lớp cơ sở (base class).

– Nhiều lớp có thể dẫn xuất từ một lớp cha.
– Một lớp có thể là dẫn xuất của nhiều lớp cha.
VD:
• Xây dựng ba lớp sau:
▫ Lớp người
▫ Lớp SinhVien
▫ Lớp GiaoVien

Nguoi
DL: hs, ns, gt
PT:nhap(), in()

SV
DL: ht, ns, gt
PT:nhap(),in(),

xeploai()

GV
DL: ht, ns, gt
PT:nhap(),
in(),
tangluong()


Câu 7: Tính đa hình, các đặc trưng của phương thức ảo, ví dụ minh hoạ?.
Trả lời:
Đa hình là khả năng cho phép:
Cho phép các lớp được định nghĩa các phương thức trùng nhau: cùng



tên, cùng số lượng và kiểu tham số, cùng kiểu trả về. Việc định nghĩa phương
thức trùng nhau của các lớp kế thừa nhau còn được gọi là sự nạp chồng phương
thức.
Khi gọi các phương thức trùng tên, dựa vào đối tượng đang gọi mà



chương trình sẽ thực hiện phương thức của lớp tương ứng, và do đó, sẽ cho các
kết quả khác nhau.
Ví dụ: Xây dựng lớp người, lớp sinh viên, lớp giáo viên cùng có phương



thức Nhap() và phương thức Xuat().

 Như vậy đa hình là khả năng cho phép viết chương trình để xử lý tổng quát các đối
tượng của tất cả các lớp trong một phân cấp như các đối tượng của lớp cơ sở. Do vậy
một thông điệp được gửi đi mà không cần biết đối tượng nhận thuộc lớp nào.
Để cài đặt phương thức có tính đa hình ta dùng phương thức ảo và phương thức
thuần ảo.
Phương thức ảo là phương thức được định nghĩa ở lớp cơ sở (lớp cha) mà các
lớp dẫn xuất (lớp con) muốn sử dụng phải định nghĩa lại. Dùng từ khoá virtual để
khai báo phương thức ảo:
Cú pháp:
virtual <kiểu trả về> <tên phương thức >(<d/s tham số>)
{
……
}

Phương thức khởi tạo không được là phương thức ảo nhưng phương thức hủy bỏ
có thể là phương thức ảo.
Đặc trưng của phương thức ảo.


Phương thức ảo khơng thể là các phương thức tĩnh.



Một phương thức ảo có thể được khai báo là friend trong một lớp khác
nhưng các hàm friend của lớp thì khơng thể là phương thức ảo.


Khơng cần thiết phải ghi rõ từ khóa virtual trước định nghĩa một




phương thức ảo trong lớp dẫn xuất.
Khi một phương thức được định nghĩa là ảo, từ lớp cơ sở đến lớp dẫn



xuất đều phải định nghĩa thống nhất về tên, kiểu trả về và danh sách các tham số. Nếu
ta sơ xuất định nghĩa phương thức khác đi thì trình biên dịch sẽ hiểu đó là phương
thức khác.
VD:
#include <iostream>
class A
{
public:
virtual void Chao() //phuong thuc ao
{
cout<<"\nA chao cac ban";
}
};
class B:public A
{
public:
void Chao()
{
cout<<"\nB chao cac ban";
}
};
class C:public A
{
public:

void Chao()
{
cout<<"\nC chao cac ban";
}
};
void main()
{
A a;
A *pa= new A; pa->Chao(); //goi chao cua A
B b;
pa=&b; pa->Chao(); //goi chao cua B
C c;
pa=&c; pa->Chao(); //goi chao cua C
}

Nhận xét:
- Phương thức Chao() có tính đa hình: cùng lời gọi pa->chao() nhưng lần 1 gọi
chao cua A, lan 2 gọi chao cua B, lan 3 goi chao cua C.


- Nếu trong lớp B, C không định nghĩa lại phương thức chào thì cả ba lần đều
gọi chào của A.
- Nếu phương thức chao() trong lớp A không khai báo virtual thì phương thức
chao() sẽ khơng có tính đa hình, khi đó cả ba lần đều gọi chào của A.
- Có thể gán địa chỉ của đt thuộc lớp con vào biến con trỏ, trỏ tới đt thuộc lớp
cha nhưng không thể làm ngược lại (áp dụng nguyên tắc “con gán vào cha” đối với
biến kiểu đối tượng hoặc biến kiểu con trỏ, trỏ tới đối tượng)
Câu 8: Trình bày vấn đề hình thoi trong đa kế thừa? Ví dụ minh họa?
Trả lời:
Vấn đề hình thoi:

Phát sinh khi một lớp con đa kế thừa từ hai hay nhiều lớp cơ sở. Các lớp cơ sở
lại kế thừa từ một lớp chung lớn hơn.
Trong lớp con sẽ tồn tại hai thực thể của lớp chung do kế thừa từ các lớp cơ sở.
Khi lớp con thực hiện một phương thức nào đó của hai lớp cơ sở hay lớp
chung.
 Trình biên dịch báo lỗi ambigous do không biết phải sử dụng phương thức của

lớp cơ sở nào.
Ví dụ:

Giải quyết vấn đề:
- Phương án 1: Định nghĩa lạo phương thức tinhChuVi cho lớp HinhThoi và
HinhChuNhat. Khi gọi phương thức thì dùng tốn tử :: như sau:
hv.HinhThoi::tinhChuVi()
-> Chương trình có tính tổng quát không cao.
- Phương án 2: Định nghĩa lại phương thức tinhChuVi cho lớp HinhVuong.


-> Khơng truy xuất được thuộc tính từ lớp HinhBinhHanh.
=> Cách giải quyết tốt nhất: dùng kế thừa ảo.


Câu 9: Trình bày các tính chất của OOP? Ví dụ minh họa?
Trả lời:


Tính đóng gói: Sự đóng gói là cơ chế ràng buộc dữ liệu và thao tác trên dữ liệu đó
thành một thể thống nhất, tránh được các tác động bất ngờ từ bên ngồi. Tính chất
khơng cho phép người dùng hay đối tượng khác thay đổi dữ liệu thành viên của đối
tượng nội tại. Chỉ có các hàm thành viên của đối tượng đó mới có quyền thay đổi

trạng thái nội tại của nó mà thơi.
VD:
class Box
{
public:
double tinhTheTich(void)
{
return chieudai * chieurong * chieucao;
}
private:
double chieudai;
// Chieu dai cua mot box
double chieurong;
// Chieu rong cua mot box
double chieucao;
// Chieu cao cua mot box
};

Các biến chieudai, chieurong, và chieucao là private. Nghĩa là chúng chỉ có thể
được truy cập bởi các thành viên khác của lớp Box, và không thể bởi bất kỳ phần
khác trong chương trình của bạn.


Tính kế thừa: Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa
trên các định nghĩa của một lớp đã có. Lớp đã có gọi là lớp Cha, lớp mới phát sinh
gọi là lớp Con. Lớp Con được thừa hưởng các thuộc tính của lớp Cha, có thể bổ sung
các thành phần hoặc định nghĩa là các thuộc tính của lớp cha.
VD:
#include <bits/stdc++.h>
using namespace std;

//Lớp Cha
class Parent {
public:
int id_p;
};
// Lớp con kế thừa từ lớp cha
class Child : public Parent {
public:
int id_c;
};


int main() {
Child obj1;
obj1.id_c = 7;
obj1.id_p = 91;
cout << "Child id is " << obj1.id_c << endl;
cout << "Parent id is " << obj1.id_p << endl;
return 0;
}

 Kết quả:
Child id is 7
Parent id is 91

Trong chương trình trên, class

Child

là lớp con, nó sẽ được kế thừa các thành


viên dữ liệu dạng public từ class Parent.

Tính đa hình: Cho phép các lớp được định nghĩa các phương thức trùng
nhau: cùng tên, cùng số lượng và kiểu tham số, cùng kiểu trả về. Việc định
nghĩa phương thức trùng nhau của các lớp kế thừa nhau còn được gọi là sự nạp
chồng phương thức.
Khi gọi các phương thức trùng tên, dựa vào đối tượng đang gọi mà chương
trình sẽ thực hiện phương thức của lớp tương ứng, và do đó, sẽ cho các kết quả
khác nhau.
VD:
#include <bits/stdc++.h>
using namespace std;
class OOP
{
public:
// Hàm có một tham số
void func(int x)
{
cout << "value of x is " << x << endl;
}
// Hàm cùng tên có một tham số nhưng khác kiểu
void func(double x)
{
cout << "value of x is " << x << endl;
}
// Hàm cùng tên nhưng có 2 tham số
void func(int x, int y)
{
cout << "value of x and y is " << x << ", " << y << endl;

}
};
int main()
{


OOP obj;
obj.func(7);
obj.func(9.132);
obj.func(85, 64);
return 0;
}

 Kết quả:
value of x is 7
value of x is 9.132
value of x and y is 85, 64

Trong ví dụ trên, ta chỉ dùng một hàm duy nhất có tên là func nhưng có thể
dùng được cho 3 tình huống khác nhau. Đây là một thể hiện của tính đa hình.
Câu 10: Trình bày các thành phần của một lớp? Ví dụ minh họa?
Trả lời:
Một lớp gồm 2 thành phần:
+ Trường: (hay cịn gọi là thuộc tính, biến thành viên) : Là các thuộc tính thể
hiện đặc điểm tính chất cho đối tượng.
+ Phương thức: (hay cịn được gọi là hành vi, hàm thành viên): Thể hiện các
hành động của đối tượng.
Ví dụ:
Chúng ta mơ hình hóa một vector hình học trong khơng gian 3d thành một lớp
đối tượng trong c++

=> Trường: tọa độ x, y, z là các kiểu số thực.
=> Phương thức: Các phép tính cho vector như là phép cộng, phép trừ, phép
tích vơ hướng…
Như vậy khi bắt đầu làm một bài toán lập trình hướng đối tượng,
chúng ta phải có bước phân tích dữ liệu để xác định được hai thành phần cho
lớp đối tượng.

Câu 11: Phân biệt tham trị (Value Type) và tham biến (Reference Type)? Minh họa
cách sử dụng các kiểu tham số này?


Trả lời:
 Tham trị trong C++ không làm thay đổi giá trị của tham số thực tế được truyền vào

hàm. Tức là khi truyền giá trị của tham số thực tế vào hàm, thì giá trị của tham số
thực tế sẽ được copy cho tham số hình thức của hàm, giá trị của tham số hình thức và
tham số thực tế ở hai bộ nhớ khác nhau, vì vậy thay đổi giá trị bên trong hàm không
làm thay đổi giá trị của tham số thực tế truyền vào.
VD:
#include <stdio.h>
#include <conio.h>
int sum(int a, int b)
{
a++;
b++;
return (a+b);
}
void main()
{
int x =1, y = 2;

int s = 0;
s = sum(x, y);
printf("\n s = %d", s);
printf("\n x = %d", x);
printf("\n y = %d", y);
getch();
}

 Kết quả:
s = 5
x = 1
y = 2

Trong ví dụ này, ta định nghĩa và khai báo hàm sum() có kiểu trả về là int, 2
tham số a,b kiểu int. Khi gặp câu lệnh gọi hàm sum() trong hàm main(). Chương trình
sẽ tạo ra 2 biến Local a,b trong hàm sum(). Giá trị của đối số x,y truyền vào sẽ được
copy và gán tương ứng cho 2 tham số a,b (a = 1,b = 2). Các câu lệnh tiếp theo trong
hàm sum() chỉ thao tác trên 2 biến Local a,b. Do vậy kết quả là giá trị biến x = 1 , y =
2.

 Phương pháp truyền tham biến là cách truyền địa chỉ của đối số cho các tham số

tương ứng của hàm được gọi. Với cách truyền tham biến, giá trị của đối số truyền vào
có thể bị thay đổi bởi việc gọi hàm.
Truyền tham biến chia ra thành 2 loại : truyền con trỏ (dùng trong C và C++) ,
truyền tham chiếu (chỉ dùng trong C++)
• Truyền con trỏ (dùng trong C/C++)


#include <stdio.h>

#include <conio.h>

 Kết quả:
X = 3
Y = 2

void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void main()
{
int x = 2, y = 3;
swap(&x, &y);
printf("\nx = %d", x);
printf("\ny = %d", y);
getch();
}

Hàm swap() làm nhiệm vụ đổi chỗ 2 biến nguyên x,y truyền vào. Đối số truyền
vào ở đây là địa chỉ 2 biến x,y (&x , &y). Trong hàm swap(), biến con trỏ a,b sẽ trỏ
tới địa chỉ của biến x,y (a = &x, b = &y). Và *a và *b chính là giá trị của 2 biến x,y.
• Truyền tham chiếu (chỉ dùng trong C++)
#include <stdio.h>
#include <conio.h>
void swap(int &a, int &b)
{

int temp;
temp = a;
a = b;
b = temp;
}
void main()
{
int x = 2, y = 3;
swap(x, y);
printf("\nx = %d", x);
printf("\ny = %d", y);
getch();
}

 Kết quả:
X = 3
Y = 2

Hàm swap() cũng làm nhiệm vụ hoán đổi vị trí giữa 2 biến nguyên truyền vào.
Trong C++ cho phép sử dụng biến tham chiếu.
+ Biến tham chiếu không được cấp phát bộ nhớ, khơng có địa chỉ riêng.
+ Nó dùng làm bí danh cho một biến (kiểu giá trị) nào đó và nó sử dụng vùng
nhớ của biến này.
Trong hàm swap(), chương trình sẽ thực hiện lệnh gán sau:
int &a = x;
int &b = y;

a,b ở đây là bí danh của biến x,y. Tức là biến a,b sẽ dùng chung vùng nhớ với
biến số x,y. Các cậu lệnh được thao tác trên biến a,b hay cũng chính là thao tác trên
biến x,y. Do vậy, hàm swap() sẽ thay đổi giá trị của đối số truyền vào.



Câu 12: Giải thích ý nghĩa các từ khóa this? Ví dụ minh họa?
Trả lời:
Mỗi đối tượng trong C++ có sự truy cập tới vị trí riêng của nó thơng qua một
con trỏ quan trọng gọi là con trỏ this. Con trỏ this trong C++ là một tham số ẩn với
tất cả hàm thành viên. Vì thế, bên trong một hàm thành viên, con trỏ this có thể tham
chiếu tới đối tượng đang gọi.
Các hàm friend khơng có con trỏ this, bởi vì friend khơng phải là các thành viên
của một lớp. Chỉ có các hàm thành viên trong C++ là có con trỏ this.
VD:
#include <iostream>
using namespace std;
class NhanVien {
int msnv;
string ten;
int tuoi;
public:
void setData(int msnv, string ten, int tuoi) {
this->msnv = msnv;
this->ten = ten;
this->tuoi = tuoi;
}
void showData() {
cout << "Ten nhan vien: " << this->ten << endl;
cout << "Ma so nhan vien: " << this->msnv << endl;
cout << "Tuoi: " << this->tuoi << endl;
}
};


Trong ví dụ này mình đã tạo ra ba thuộc tính để lưu trữ thơng tin của một nhân
viên đó là: manv, ten, tuoi. Ngồi ra mình có tạo thêm phương thức setData() dùng
để gán dữ liệu cho sinh viên, và showData() dùng để hiển thị dữ liệu.
Trong phương thức setData() mình đã sử dụng từ khóa this->ten_thuoc_tinh để
thực hiện phép gán dữ liệu cho các thuộc tính, cịn ở phương thức

showData()

mình

cũng sử dụng cú pháp tương tự để hiển thị dữ liệu của các thuộc tính. Như vậy cơng
dụng của từ khóa this chính là một con trỏ và trỏ đến địa chỉ của đối tượng hiện tại.

Câu 13: Phân biệt khái niệm class và object, cho ví dụ minh họa?
Trả lời:


Class là một mơ hình chi tiết để bạn sử dụng tạo ra các Object. Class định
nghĩa tất cả các thuộc tính và các phương thức cần thiết của một Object.




Mỗi Object phải thuộc một Class nào đó. Và một Object là một thể hiện của
Class. Tất cả các Object thuộc về cùng một Class có cùng các thuộc tính và các
phương thức.
Vd:
#include <iostream>
using namespace std;
class Student {

public:
int id;
string name;
};
int main() {
Student s1; // tao doi tuong Student
s1.id = 10001;
s1.name = "Vinh Phan";
cout << s1.id << endl;
cout << s1.name << endl;
return 0;
}

Trong ví dụ trên, tạo đối tượng của lớp Student bằng cách sử dụng s1 làm biến
tham chiếu.
Câu 14: Phân biệt các khái niệm và sự khác nhau giữa nạp chồng (overload) và ghi
đè (override).
Trả lời:
Nạp chồng – Overloading :
- Các phương thức nằm trong cùng 1 lớp , có cùng tên với nhau nhưng có danh
sách đối số khác nhau được gọi là các phương thức nạp chồng.
- Hàm tạo cũng có thể được nạp chồng.
- Tùy theo ta gọi đối số thế nào mà nó sẽ gọi hàm tương ứng.
- Nạp chồng là hình thức đa hình (polymorphism) trong quá trình biên dịch
(compile time).
Ghi đè – override :
- là Phương thức đã xuất hiện ở lớp cha và xuất hiện tiếp ở lớp con.
- Khi đối tượng thuộc lớp con gọi phương thức thì sẽ chọn lựa và chạy theo
phương thức trong lớp con.
- Nếu lớp con khơng có phương thức đó thì mới lên kiếm ở lớp cha để chạy

- Ghi đè là hình thức đa hình (polymorphism) trong quá trình thực thi (Runtime)


Câu 15: Hàm bạn được sử dụng trong trường hợp nào? Ví dụ minh họa?
Trả lời:
Một hàm friend của một lớp được định nghĩa bên ngoài phạm vi của lớp đó, lúc
này có quyền truy cập đến các thành viên private hoặc protected của một lớp. gay cả
khi các nguyên mẫu cho hàm friend xuất hiện trong định nghĩa lớp, thì các hàm
friend khơng là các hàm thành viên.
Một friend có thể là một hàm, một mẫu hàm, hoặc hàm thành viên, hoặc một
lớp hoặc 1 mẫu lớp, trong trường hợp này, toàn bộ lớp và tất cả thành viên của nó là
friend.
VD:
#include <iostream>
using namespace std;
class Box
{
double chieurong;
public:
friend void inChieuRong( Box box );
void setChieuRong( double rong );
};
void Box::setChieuRong( double rong ) // phan dinh nghia ham thanh vien
{
chieurong = rong;
}
// Ghi chu: inChieuRong() khong la ham thanh vien cua bat cu class nao.
void inChieuRong( Box box )
{
/* Boi vi, ham inChieuRong() la ham friend cua Box, do vay no co the

truc tiep truy cap bat cu thanh vien nao cua class nay */
cout << "Chieu rong cua box la: " << box.chieurong <}
int main( ) // ham main cua chuong trinh
{
Box box;
// thiet lap chieurong cua box, khong su dung ham thanh vien
box.setChieuRong(25.3);

}

inChieuRong( box ); // su dung ham friend de in chieu rong.
return 0;



×