Câu hỏi phỏng vấn Lập trình viên C++

109 Các câu hỏi phỏng vấn Lập trình viên C++ được chia sẻ bởi các ứng viên

Phỏng vấn là một phần cần thiết trong quá trình lựa chọn của bất kỳ công ty hoặc tổ chức nào. Để đối mặt với thử thách này, bạn cần chuẩn bị đầy đủ về mặt tinh thần lẫn chất lượng các câu trả lời. Đặc biệt là trong lĩnh vực IT, khi các câu hỏi kỹ thuật được cho là chủ đề chính trong các buổi phỏng vấn. Bài tổng hợp các câu hỏi phỏng vấn C++ đến từ 1900 ở dưới đây sẽ giúp bạn có được sự chuẩn bị ưng ý nhất!

Các câu hỏi phỏng vấn chuyên môn

Câu 1: Các kiểu dữ liệu khác nhau có trong C++ là gì?

Đây là dạng câu hỏi cơ bản nhất trong số các câu hỏi phỏng vấn C++ thường gặp. Có 4 kiểu dữ liệu trong C++, cụ thể:

  • Kiểu dữ liệu nguyên thủy (kiểu dữ liệu cơ bản). Ví dụ- char, short, int, float, long, double, bool, v.v.
  • Kiểu dữ liệu dẫn xuất. Ví dụ- array, pointer, v.v.
  • Kiểu dữ liệu liệt kê. Ví dụ- enum
  • Các kiểu dữ liệu do người dùng định nghĩa. Ví dụ- structure, class, v.v.

Câu 2: Giải thích hai khái niệm lớp (class) và đối tượng (object) trong C++

Trong C++, class hay lớp được hiểu là bản thiết kế của object – đối tượng. Nó là kiểu dữ liệu do người dùng định nghĩa với các thành viên dữ liệu và các hàm thành viên và được định nghĩa bằng từ khóa class.

Ngược lại, bạn có thể định nghĩa object – đối tượng là sự thể hiện hay xuất hiện của một class – lớp. Khi nó tạo đối tượng, thì nó có thể hoạt động trên cả thành viên dữ liệu và hàm thành viên.

Câu 3: Ưu điểm của C++ là gì?

Các câu hỏi phỏng vấn C++ dạng này đòi hỏi bạn phải có kiến thức vững chắc về cả C lẫn C++. C++ không chỉ duy trì tất cả các khía cạnh tốt đẹp từ ngôn ngữ C, nó còn đơn giản hóa việc quản lý bộ nhớ và thêm một số tính năng như:

  • C++ là ngôn ngữ có tính di động cao, nghĩa là phần mềm được phát triển bằng ngôn ngữ C++ có thể chạy trên mọi nền tảng.
  • C++ là ngôn ngữ lập trình hướng đối tượng bao gồm các khái niệm như lớp, đối tượng, kế thừa, đa hình, trừu tượng.
  • C++ có khái niệm kế thừa. Thông qua kế thừa, người ta có thể loại bỏ mã dư thừa và có thể sử dụng lại các lớp hiện có.
  • Ẩn dữ liệu giúp lập trình viên xây dựng các chương trình an toàn để chương trình không thể bị tấn công bởi hacker.
  • C++ chứa một thư viện hàm phong phú.

Câu 4: Hãy phân biệt vòng lặp while và vòng lặp do-while trong C++

Vòng lặp while xác minh điều kiện; nếu nó đúng, thì nó sẽ lặp lại vòng lặp cho đến khi điều kiện trở thành sai. Nếu điều kiện là sai trong vòng lặp while, thì không một câu lệnh nào sẽ thực thi bên trong vòng lặp.

Đối với vòng lặp do-while, mọi chuyện diễn ra khác hơn ở phần sau. Đầu tiên, vòng lặp do-while lặp lại thân vòng lặp một lần, sau đó nó kiểm tra điều kiện. Nếu điều kiện trong vòng lặp do-while là sai, thì phần thân cũng sẽ thực hiện một lần.

Câu 5: Bạn hiểu gì về đa hình trong C++?

Thuật ngữ đa hình đề cập đến sự hiện diện của nhiều hình thức. Thuật ngữ này cũng được đề cập khá thường xuyên trong các câu hỏi phỏng vấn C++.

Tính đa hình thường xảy ra khi có một hệ thống phân cấp của các lớp được liên kết với nhau bằng tính kế thừa. Tính đa hình trong C++ có nghĩa là tùy thuộc vào loại đối tượng gọi hàm mà một hàm khác sẽ được thực thi.

Câu 7: Chức năng ảo là gì?

Một hàm thành viên trong lớp cơ sở được định nghĩa lại trong lớp dẫn xuất là một hàm ảo. Nó được khai báo bằng từ khóa virtual. Chức năng ảo có nhiệm vụ đảm bảo sự chính xác trong việc gọi đối tượng của một hàm. Điều này đúng trong mọi trường hợp kể cả khi chúng ta tạo lệnh với tham chiếu hay con trỏ để gọi hàm đó. Các chức năng ảo chủ yếu được sử dụng cho đa hình thời gian chạy.

Câu 8: Trừu tượng hóa trong C++ là gì?

Trừu tượng hóa là quá trình hiển thị các chi tiết cần thiết cho người dùng và ẩn các chi tiết mà nhà phát triển không muốn hiển thị cho người dùng hoặc ẩn các chi tiết không liên quan đến một người dùng cụ thể.

Câu 9: Ba loại chỉ định truy cập C++ khác nhau là gì?

Đối với các câu hỏi phỏng vấn C++, ba loại chỉ định truy cập thường dễ gây nhầm lẫn. Cụ thể:

  • Public: Tất cả các hàm thành viên và thành viên dữ liệu đều có thể truy cập được bên ngoài lớp.
  • Protected: Ở trong lớp (class) và lớp dẫn xuất, các hàm thành viên và thành viên dữ liệu đều được cấp quyền truy cập.
  • Private: Hạn chế quyền truy cập dữ liệu bên ngoài lớp của tất cả các chức năng thành viên và thành viên dữ liệu.

Câu 10: Gọi theo giá trị và gọi theo tham chiếu trong C++ là gì?

Trong phương thức gọi theo giá trị, bạn chuyển các bản sao của tham số thực sang tham số hình thức của hàm. Điều này có nghĩa là nếu có bất kỳ thay đổi nào về giá trị bên trong hàm thì thay đổi đó sẽ không ảnh hưởng đến giá trị thực.

Trong phương thức gọi theo tham chiếu, tham chiếu hoặc địa chỉ của các tham số thực tế được gửi đến các tham số chính thức của hàm. Điều này có nghĩa là mọi thay đổi về giá trị bên trong hàm sẽ được phản ánh trong các giá trị thực tế.

Câu 11: Khi nào thì kiểu trả về void() được sử dụng?

Kiểu trả về void() trong C++ không hợp lệ, vì không thể khai báo một hàm trả về một kiểu dữ liệu không hợp lệ. Tuy nhiên, ta có thể sử dụng kiểu trả về void trong C++ khi chúng ta muốn chỉ thực hiện một hành động mà không cần trả về bất kỳ giá trị nào từ hàm đó.

Câu 12: Toán tử phân giải phạm vi là gì?

Toán tử phân giải phạm vi được biểu diễn dưới dạng :: Toán tử này được sử dụng để liên kết định nghĩa hàm với một lớp cụ thể.

Toán tử phạm vi được sử dụng cho các mục đích sau:

  • Để truy cập một biến toàn cục khi bạn có một biến cục bộ trùng tên.
  • Để định nghĩa một hàm bên ngoài lớp.

Câu 13: Sự khác biệt giữa bản sao nông và bản sao sâu là gì?

Các câu hỏi phỏng vấn C++ ở mức độ Advanced thường hay đề cập đến khả năng phân biệt hai khái niệm đối lập nhau. Bản sao nông lưu trữ các tham chiếu của các đối tượng đến địa chỉ bộ nhớ ban đầu. Bản sao nông nhanh hơn bản sao sâu và phản ánh những thay đổi được thực hiện đối với đối tượng mới/được sao chép trong đối tượng ban đầu.

Ngược lại, bản sao sâu tạo một bản sao mới và riêng biệt của toàn bộ đối tượng với địa chỉ bộ nhớ duy nhất của nó. Bản sao sâu tương đối chậm. Bản sao sâu không phản ánh những thay đổi được thực hiện đối với đối tượng mới/được sao chép trong đối tượng gốc

Câu 14: Nếu lớp D được dẫn xuất từ một lớp cơ sở B. Khi tạo một đối tượng kiểu D, các hàm tạo của các lớp này sẽ được gọi theo thứ tự nào?

Dạng câu hỏi tình huống như trên cũng hay xuất hiện trong các câu hỏi phỏng vấn C++. Lớp dẫn xuất có hai phần, phần cơ sở và phần dẫn xuất. Khi C++ xây dựng các đối tượng dẫn xuất, nó thực hiện theo từng giai đoạn. Đầu tiên, lớp cơ sở nhất (ở trên cùng của cây thừa kế) được xây dựng. Sau đó, mỗi lớp con được xây dựng theo thứ tự cho đến khi lớp con nhiều nhất được xây dựng sau cùng.

Vì vậy, hàm tạo đầu tiên của lớp B sẽ được gọi và sau đó hàm tạo của lớp D sẽ được gọi. Trong quá trình phá hủy, mọi thứ sẽ tuân theo thứ tự ngược. Đó là hàm hủy bắt đầu ở lớp có nguồn gốc cao nhất và di chuyển xuống lớp cơ sở. Vì vậy, hàm hủy đầu tiên của lớp D sẽ được gọi và sau đó hàm hủy của lớp B sẽ được gọi.

Những lưu ý khi đi phỏng vấn vị trí lập trình viên C++

Dưới đây là một số lưu ý quan trọng khi bạn đi phỏng vấn cho vị trí lập trình viên C++ hoặc bất kỳ vị trí công việc nào:

Nghiên cứu công ty

Trước khi đi phỏng vấn, hãy tìm hiểu kỹ về công ty mà bạn sẽ phỏng vấn. Điều này bao gồm hiểu về lịch sử, vị trí trong thị trường, văn hóa công ty, và các dự án quan trọng mà họ đang làm.

Chuẩn bị câu trả lời

Hãy chuẩn bị các câu trả lời cho các câu hỏi thường gặp trong phỏng vấn như "Giới thiệu về bản thân," "Tại sao bạn muốn làm việc ở đây?" và "Tại sao bạn phù hợp cho vị trí này?"

Thể hiện kỹ năng C++

Chuẩn bị để thể hiện kỹ năng lập trình C++ của bạn. Bạn có thể được yêu cầu giải quyết bài tập lập trình hoặc trả lời các câu hỏi kỹ thuật về ngôn ngữ lập trình này.

Sự tự tin và chuyên nghiệp

Điều này bao gồm cách bạn giao tiếp, ăn mặc, và thái độ tự tin trong suốt cuộc phỏng vấn. Hãy thể hiện rõ ràng sự chuyên nghiệp và đam mê của bạn đối với công việc.

Câu hỏi cho người tuyển dụng

Đừng quên chuẩn bị một số câu hỏi để hỏi người tuyển dụng. Điều này thể hiện sự quan tâm của bạn và giúp bạn hiểu rõ hơn về công việc và môi trường làm việc.

Thái độ tích cực và linh hoạt

Thể hiện thái độ tích cực và sẵn sàng học hỏi và thích nghi trong môi trường làm việc mới.

Chú ý đến cơ hội phát triển

Hỏi về cơ hội phát triển sự nghiệp và sự hỗ trợ mà công ty có thể cung cấp cho bạn để bạn có thể xây dựng tương lai tại công ty.

Kỹ năng giải quyết vấn đề

Thể hiện khả năng giải quyết vấn đề của bạn bằng cách đặt ra các ví dụ cụ thể về cách bạn đã đối phó với các thách thức trong quá khứ.

Theo dõi sau phỏng vấn

Sau khi phỏng vấn, gửi một email cảm ơn ngắn gọn đến người phỏng vấn để thể hiện lòng biết ơn và quan tâm của bạn đối với vị trí.

Giữ thái độ thoải mái

Cố gắng giữ thái độ thoải mái và tự tin trong suốt quá trình phỏng vấn. Điều này sẽ giúp bạn tạo ấn tượng tích cực với người tuyển dụng.

Câu hỏi phỏng vấn

Lập trình viên C++ được hỏi... 27/10/2023

Đáp án nào sau đây truy cập phần tử thứ bảy được lưu trữ trong mảng?

1 câu trả lời

  • array[6];
  • array[7];
  • array(7);
  • array;

Câu trả lời là array[6]

Lập trình viên C++ được hỏi... 27/10/2023

Kết quả của chương trình sau là gì?

1 câu trả lời

 
 
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
int array1[] = {1200, 200, 2300, 1230, 1543};
int array2[] = {12, 14, 16, 18, 20};
int temp, result = 0;
 
int main()
{
    for (temp = 0; temp < 5; temp++)
    {
        result += array1[temp];
    }
    for (temp = 0; temp < 4; temp++)
    {
        result += array2[temp];
    }
    cout << result;
    return 0;
}

Kết quả là 6533.

Lập trình viên C++ được hỏi... 27/10/2023

Chỉ số của phần tử cuối cùng của mảng có 9 phần tử là bao nhiêu?

1 câu trả lời

Kết quả là 8 vì phần tử bắt đầu có chỉ số là 0.

Lập trình viên C++ được hỏi... 27/10/2023

Định nghĩa đúng về mảng là gì?

1 câu trả lời

Mảng là một chuỗi các phần tử cùng kiểu ở các vị trí bộ nhớ liền nhau.

Lập trình viên C++ được hỏi... 27/10/2023

Đáp án nào sau đây cung cấp địa chỉ bộ nhớ của phần tử đầu tiên trong mảng?

1 câu trả lời

  • array[0];
  • array[1];
  • array(2);
  • array;

Đáp án là array. Để lấy địa chỉ của chỉ số thứ i của một mảng, chúng ta sử dụng cú pháp sau (array + i). Vì vậy, khi chúng ta cần địa chỉ của chỉ mục đầu tiên, chúng ta sẽ sử dụng (array + 0) tương đương với array.

Lập trình viên C++ được hỏi... 27/10/2023

Kết quả của chương trình này là gì?

1 câu trả lời

#include <stdio.h>
#include<iostream>
using namespace std;
 
int main()
{
    int a = 5, b = 10, c = 15;
    int arr[3] = {&a, &b, &c};
    cout << *arr[*arr[1] – 8];
    return 0;
}

Biên dịch chương trình lỗi. Lỗi không thể chuyển đổi ‘int*’ thành ‘int’ sẽ được in ra. Đó là do &a, &b và &c đại diện cho int* trong khi mảng được xác định là kiểu int.

Lập trình viên C++ được hỏi... 27/10/2023

Kết quả của chương trình này là gì?

1 câu trả lời

#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = {4, 5, 6, 7};
    int *p = (arr + 1);
    cout << *p;
    return 0;
}

Kết quả là 5. Chúng ta đang cho con trỏ trỏ đến giá trị tiếp theo và in ra nó.

Lập trình viên C++ được hỏi... 27/10/2023

Kết quả của chương trình sau là gì ?

1 câu trả lời

 
#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = {4, 5, 6, 7};
    int *p = (arr + 1);
    cout << *arr + 9;
    return 0;
}

Kết quả là 13 vì chúng ta đang cộng thêm 9 vào giá trị đầu tiên trong mảng.

Lập trình viên C++ được hỏi... 27/10/2023

Các thành phần của hằng ký tự (literals constant) là gì ?

1 câu trả lời

  • Các số nguyên.
  • Các số chấm động.
  • Các chuỗi và giá trị boollean.
  • Các đáp án trên.

Kết quả: 4

Lập trình viên C++ được hỏi... 27/10/2023

Hằng được khai báo như thế nào ?

1 câu trả lời

Sử dụng từ khoá const để khai báo hằng với kiểu cụ thể hoặc sử dụng #define

Lập trình viên C++ được hỏi... 27/10/2023

Thực hiện một hàm F có kiểu trả về là void và nhận các con trỏ đến hai mảng số nguyên (A và B) và kích thước N làm tham số. Sau đó, nó tính tích B trong đó B[i] là tích của tất cả A[j] trong đó j! = i.

1 câu trả lời

 
void F(int* A, int* B, int N)
{
    int m = 1;
    for(int i = 0; i < N; ++i) {
        m *= A[i];
    }
    for (int i = 0; i < N; ++i) {
        B[i] = m / A[i];
    }
}
Lập trình viên C++ được hỏi... 27/10/2023

Khi nào nên sử dụng thừa kế virtual ?

1 câu trả lời

Mặc dù lý tưởng nhất là tránh hoàn toàn thừa kế ảo (chúng ta nên biết lớp của mình sẽ được sử dụng như thế nào) nhưng việc hiểu rõ về cách hoạt động của kế thừa ảo vẫn là điều quan trọng:

Vì vậy, khi ta có một lớp (lớp A) kế thừa từ 2 lớp cha (B và C), cả hai lớp này đều chia sẻ một lớp cha (lớp D), như được minh họa bên dưới:

#include <iostream>
 
class D {
public:
    void foo() {
        std::cout << “Foooooo” << std::endl;
    }
};
 
class C: public D {
};
 
class B: public D {
};
 
class A: public B, public C {
};
 
int main(int argc, const char * argv[]) {
    A a;
    a.foo();
}
Lập trình viên C++ được hỏi... 27/10/2023

Có sự khác biệt gì giữa struct và class không ?

1 câu trả lời

Sự khác biệt duy nhất giữa classstruct là các công cụ sửa đổi quyền truy cập. Các thành viên struct được công khai theo mặc định; các thành viên trong class là riêng tư. Cách tốt là sử dụng các class khi bạn cần một đối tượng có các phương thức và struct khi bạn có một đối tượng dữ liệu đơn giản.

Lập trình viên C++ được hỏi... 27/10/2023

Cho biết kết quả của chương trình sau ?

1 câu trả lời

 
#include <iostream>
 
int main(int argc, const char * argv[])
{
    int a[] = {1, 2, 3, 4, 5, 6};
    std::cout << (1 + 3)[a] – a[0] + (a + 1)[2];
}

Kết quả chương trình trên là 8, vì (1+3)[a] thì giống như a[1+3] = 5, a[0] = 1 và (a + 1)[2] thì giống như a[3] = 4.

Câu hỏi này dùng để kiểm tra kiến ​​thức số học của con trỏ và điều kỳ diệu đằng sau dấu ngoặc vuông với con trỏ.

Mặc dù một số người có thể tranh luận rằng đây không phải là một câu hỏi có giá trị vì nó dường như chỉ kiểm tra khả năng đọc các cấu trúc C, nhưng điều quan trọng là ứng viên phải có khả năng vượt qua nó về mặt tinh thần; đó không phải là câu trả lời mà họ dự kiến sẽ biết ngay từ đầu, mà là câu trả lời nơi họ nói về kết luận mà họ đạt được và cách thức thực hiện nó.

 
 
Lập trình viên C++ được hỏi... 27/10/2023

Giải thích các từ khóa volatile và mutable

1 câu trả lời

Từ khóa volatile thông báo cho trình biên dịch rằng một biến có thể thay đổi mà trình biên dịch không biết. Các biến được khai báo là volatile sẽ không được trình biên dịch lưu vào bộ nhớ đệm cache và do đó sẽ luôn được đọc từ ram.

Từ khóa mutable có thể được sử dụng cho các biến thành viên của lớp. Các biến mutable được phép thay đổi từ bên trong các hàm thành viên const của lớp.

Lập trình viên C++ được hỏi... 27/10/2023

Vòng lặp sau sẽ lặp bao nhiêu lần ?

1 câu trả lời

 
unsigned char half_limit = 150;
for (unsigned char i = 0; i < 2 * half_limit; ++i)
{
    // do something;
}

Nếu bạn nói 300, bạn sẽ đúng nếu nó được khai báo là một int. Tuy nhiên, vì nó được khai báo là unsigned char, câu trả lời chính xác là mã này sẽ dẫn đến một vòng lặp vô tận.

Biểu thức 2 * half_limit sẽ được thăng cấp thành int (dựa trên quy tắc chuyển đổi C++) và sẽ có giá trị là 300. Tuy nhiên, vì nó là một unsigned char, nên nó được đánh dấu lại bằng một giá trị 8 bit, sau khi đạt đến 255, sẽ tràn (vì vậy nó sẽ trở về 0) và vòng lặp do đó sẽ tiếp diễn mãi mãi.

Lập trình viên C++ được hỏi... 27/10/2023

Bạn có được phép có một hàm thành viên const tĩnh không? Giải thích câu trả lời của bạn.

1 câu trả lời

Hàm thành viên const là một hàm không được phép sửa đổi các thành viên của đối tượng mà nó được gọi. Hàm thành viên tĩnh là một hàm không thể được gọi cho một đối tượng cụ thể. Do đó, sửa đổi const cho một hàm thành viên tĩnh là vô nghĩa, bởi vì không có đối tượng nào được liên kết với lời gọi.

Một lời giải thích chi tiết hơn về lý do này đến từ ngôn ngữ lập trình C. Trong C, không có các lớp và các hàm thành viên, vì vậy tất cả các hàm đều là toàn cục. Một lời gọi hàm thành viên được dịch thành một lời gọi hàm toàn cục.

Hãy xem xét một hàm thành viên như void foo(int i);. Một lời gọi hàm obj.foo(10); sẽ được biên dịch thành foo(&obj, 10);. Điều này có nghĩa là hàm thành viên foo có đối số đầu tiên bị ẩn kiểu T*, void foo(T* const this, int i);, Nếu một hàm thành viên là const, thì đây là kiểu const T* const, void foo(const T* const this, int i);. Hàm thành viên tĩnh không có đối số ẩn như vậy, vì vậy không có con trỏ this là const hay không.

Lập trình viên C++ được hỏi... 27/10/2023

Lớp lưu trữ là gì ?

1 câu trả lời

Một lớp xác định vòng đời và phạm vi của các biến và hàm của nó được gọi là lớp lưu trữ.

Trong C++, các lớp lưu trữ sau được hỗ trợ: auto, static, register, extern và mutable.

Tuy nhiên, lưu ý rằng từ khóa register không được chấp nhận trong C++11.

Trong C++17, nó đã bị loại bỏ và dành để sử dụng trong tương lai.

Lập trình viên C++ được hỏi... 27/10/2023

Một hàm C được gọi trong chương trình C++ như thế nào ?

1 câu trả lời

Sử dụng khai báo extern C.

//C code
void func(int i)
{
    //code
}
 
void print(int i)
{
    //code
}
 
//C++ code
extern “C”{
    void func(int i);
    void print(int i);
}
 
void myfunc(int i)
{
    func(i);
    print(i);
}
Lập trình viên C++ được hỏi... 27/10/2023

Vòng lặp lồng nhau là gì ?

1 câu trả lời

Vòng lặp lồng nhau là một vòng lặp chạy trong một vòng lặp khác. Nói một cách khác, bạn có một vòng lặp bên trong nằm trong một vòng lặp bên ngoài.

Trong trường hợp này, vòng lặp bên trong thực hiện một số lần như được chỉ định bởi vòng lặp bên ngoài.

Đối với mỗi lượt trên vòng ngoài, vòng trong được thực hiện đầu tiên.

Đang xem 21 - 40 trong 109 câu hỏi phỏng vấn