[C++] Trả lời các câu hỏi phỏng vấn C++ (P2)

Các bạn có thể xem tất cả các câu hỏi tại Các câu hỏi phỏng vấn C++

Xem các câu trả lời từ 1-11 tại Trả lời các câu hỏi phỏng vấn C++ ( P1 )

Xem các câu trả lời từ 23 – 36 tại Trả lời các câu hỏi phỏng vấn C++ ( P3)

12. Một hàm tạo sao chép (copy constructor) có nghĩa là gì và khi nào thì nó được sử dụng, đặc biệt là khi so sánh với toán tử =

Hàm tạo sao chép là 1 loại đặc biệt của constructor, tạo 1 đối tượng mới  từ đối tượng đã có.

class ExpClass

{
   
   //TODO

};

ExpClass expA;
 
ExpClass expB = expA; // Hàm tạo sao chép được gọi
 
ExpClass expC(expA); //Hàm tạo sao chép được gọi
 
ExpClass expD;
 
expD = expA; //Toán tử gán được gọi

13. Điểm khác nhau giữa một sao chép “shallow” và “deep” là gì?

Shallow copy :

  • Copy giá trị của đối tượng này sang đối tượng khác.
  • Với con trỏ thì chỉ copy giá trị (2 đối tượng vẫn trỏ đến cùng địa chỉ của con trỏ đó)
    => đối tượng này thay đối giá trị của con trỏ thì đối tượng kia cũng thay đổi theo.

Deep copy :

  • Copy giá trị của đối tượng này sang đối tượng khác.
  • Với con trỏ được tạo địa chỉ mới gán cho đối tượng sao chép.
    => đối tượng này thay đối giá trị của con trỏ thì đối tượng KO thay đổi.
    => trong deep copy phải nạp chồng toán tử gán và định nghĩa lại hàm copy constructor

14. Hằng toán tử (const operator) nghĩa là gì và nó được sử dụng như thế nào?

Để chắc chắn rằng toán tử không thay đổi giá trị của các toán hạng

15. Điểm khác nhau giữa truyền tham chiếu, truyền tham trị, và truyền bởi con trỏ trong C++ là gì?

Truyền tham trịTruyền tham chiếuTruyền con trỏ
Tạo bản sảo của biến được truyền vào, các biểu thức trong hàm thực hiện trên bản sao.Thao tác trực tiếp trên địa chỉ của biến được truyền vàoThao tác trên địa chỉ của con trỏ trỏ tới
Giá trị của biến truyền vào không thay đổi sau khi thực hiện hàm.Giá trị của biến thay đổi sau khi thực hiện hàm, nếu trong hàm làm thay đổi giá trị biến.Giá trị tại địa chỉ con trỏ trỏ tới thay đối sau khi thực thiện hàm nếu trong hàm làm thay đổi giá trị

16. Khi nào thì nên và khi nào thì không nên trả về một giá trị bởi tham chiếu trong C++

Hàm trả về tham chiếu sẽ không gọi hàm copy constructor.

Dùng hàm trả về tham chiếu khi kết thúc hàm mà biến trả về vẫn tồn tại.

17. Điểm khác nhau giữa một biến tạo ra trên ngăn xếp (stack) và một biến tạo ra trên heap là gì?

Vùng nhớ trên stack được cấp phát khi biên dich, còn heap được cấp phát lúc runtime.

Vùng nhớ trên stack sẽ tự động xóa khi kết thúc block, vùng nhớ được cấp phát trên heap phải tự giải phóng (sử dụng free, delete)

18. Làm thế nào để bạn giải phóng bộ nhớ đã cấp phát động cho một mảng?

Để giải phóng bộ nhơ cấp phát động cho mảng ta dùng lênh : delete[]

int* arr = new int[10];

delete[] arr;

19. Đa kế thừa là gì? Khi nào thì nó nên được sử dụng?

Đa kế thừa là 1 lớp con kế thừa từ nhiều lớp cha( 1 lớp được dẫn xuất từ nhiều lớp cơ sở)

Mình nghĩ không nên sử dụng, tránh được càng tốt.

20. Một hàm ảo thuần túy (pure virtual) là gì?

Hàm thuần ảo là hàm được khai báo trong trong lớp cơ sở không có định nghĩa hàm, nó bắt buộc định nghĩa trong lớp dẫn xuất.

class Base

{
   
public:
      
   virtual void ExpFunc() = 0; //pure virtual

}

21. Từ khóa mutable có ý nghĩa gì?

mutable cho phép ta thay đổi biến thành viên (data member) của hằng đối tượng (const object)

class ExpClass

{
   
public:
      
   mutable int val;

};

int main()

{
   
   const ExpClass exp;
   
   exp.val = 10;
   
   return 0;

}

22. Từ khóa volatile có ý nghĩa gì?

Từ khóa volatile dùng cho object, thông báo với trình biên dich là giá trị của object đó có thể được thay đổi bởi hệ điều hành, 1 thread khác ……

Compiler sẽ không optimize biến được khai báo volatile

Xem ví dụ về volatile tại : Debug và Release trong visual studio

Leave A Comment?