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

Sau đây là các câu trả lời từ 1-11. Các câu trả lời ngắn gọn, các bạn muốn biết chi tiết có thể tìm hiểu thêm.

Các bạn có thể xem toàn bộ 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ừ 12 – 22 tại Trả lời các câu hỏi phỏng vấn C++ ( P2)

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)

1. Có bao nhiêu cách để khởi tạo một kiểu dữ liệu nguyên thủy trong C++ và đó là những cách nào?

Có các cách sau:

  • int val = 10;  // copy initialization
  • int val(10);   // direct initialization
  • int val{10};   // uniform initialization (support từ C++11)

2. Tại sao bạn nên khai báo một hàm hủy là ảo (virtual)?

Bạn cần khai báo hàm hủy là virtual khi class đó được thiết kế là Base Class để class khác kế thừa nó.(Nếu class chắc chắn không có class khác kế thừa không cần khai báo là virtual).

Một đối tượng của lớp dẫn xuất có thể được hủy thông qua con trỏ của lớp cơ sở

class Base 

{ 
   
    // ... 
    virtual ~Base();

};

class Derived : public Base 

{ 

     // ...
     ~Derived(); 

};

void f()

{ 

    Base* p = new Derived; 

    delete p; // Hàm hủy ảo đê chắc chắn ~Derived được gọi 

}

=> Virtual destructor được khai báo để chắc chắn hàm hủy của lớp dẫn xuất được gọi.Nếu không khái báo virtual thì chỉ gọi hàm hủy của Base class.

3. Nó có nghĩa gì khi nói rằng C++ hỗ trợ overloading (nạp chồng)?

Nạp chồng (overloading) là các hàm có cùng tên nhưng khác parameter (overloading không quan tâm đến kiểu dữ liệu trả về)

Ta có thế khai báo nhiều hàm cùng tên nhưng khác parameter trong cùng phạm vi truy cập.

4.  Nêu ra một số ví dụ về overloading trong C++?


int Add(int a, int b)

{

   return a + b;

}

float Add(float a, float b)

{
 
   return a + b;

}

5. Khái niệm name mangling trong C++ có nghĩa là gì và tại sao nó lại được sử dụng?

Trong C++ hỗ trợ overloading, Vậy làm sao để trinhfh biên dịch xác định được chính xác hàm nào được gọi khi chúng có cùng tên chỉ khác parameter.

Để giải quyết vấn đề này C++ complier sẽ thay đổi tên của hàm bằng cách thêm các thông tin về parameter sau tên hàm. Đó gọi là name mangling.

6.Một lớp trừu tượng cơ sở (abstract base) có nghĩa là gì?

Các lớp dẫn xuất (kế thừa) từ nó BẮT BUỘC phải implement các function abstract.

7. RTTI có nghĩa là gì?

RTTI (Run-time type Information) giúp hiển thị thông tín và kiểu dữ liệu của đối tượng lúc runtime.

C++ hỗ trợ safe type cast, nó sẽ check lúc runtime : dynamic_cast

Hiển thị thông tin lúc runtime : typeidstd::type_info

8. Làm thế nào để bạn có thể truy cập một biến mà nó bị “che khuất” bởi một biến khác có cùng tên?

Ta có thể sử dụng không gian tên : namespace::tên biến.

Với biến toàn cục ta dùng :  ::tên biến.

Ví dụ:


#include <iostream>

using namespace std;

//Biến toàn cục
int val = 10;

int main()

{

//Biến cục bộ
int val = 20;

//Thay đổi giá trị biến toàn cục
::val = 30;

//Hiển thị giá trị biến cục bộ
cout << "val = " << val << endl;

//Hiển thị giá trị biến toàn cục
cout << "::val = " << ::val << endl;

return 0;

}

9. Khái niệm namespace có nghĩa là gì và làm thế nào để sử dụng nó?

Sử dung namespace để định nghĩa bối cảnh cho các tên được được định nghĩa. Nó xác định phạm vi mà trong đó các định danh của đối tượng là duy nhất. Ta có thể định nghĩa các đối tượng cùng tên trong các namespace khác nhau.

Để định nghĩa 1 namespace ta sử dung từ khóa namespace

namespace
{
   //Code here
}

Để sử dụng namespace ta dùng các cách sau:

  • Dùng câu lệnh using :
using namespace ten_namespace;
  • Dùng toán tử ‘::‘ :
ten_namespace::doi_tuong

10. Điểm khác nhau giữa một lớp và một cấu trúc (struct) trong C++ là gì, và so sánh với ngôn ngữ C thì như thế nào?

Struct : Phạm vi truy cập của các thành phần mặc định là public

Class : Phạm vi truy cập của các thành phần mặc định là private

Với struct trong C chỉ có các trường, ko thể định nghĩa phương thức trong struct.

11. Khái niệm template là gì? Làm thế nào để sử dụng chúng?

Template là 1 khuôn mẫu, hỗ trợ generic programming, giúp bạn viết code độc lập với bất kỳ kiểu dữ liệu nào.

Sử dụng template :

  • Function template :
template <typename T>

template <typename T>

T Add (T param1, T param2)

{

   return param1 + param2;

}

  • Class template :
template <class type>

template <class T>

class Example

{

private:

   T m_val;

};

Leave A Comment?