JavaScript is required
Danh sách đề

700+ câu hỏi trắc nghiệm Ngôn ngữ lập trình C có lời giải chi tiết - Đề 16

17 câu hỏi 60 phút

Thẻ ghi nhớ
Luyện tập
Thi thử
Nhấn để lật thẻ
1 / 17

Which of the following can be virtual?

A.

constructors

B.

destructors

C.

static functions

D.

None of the above

Đáp án
Đáp án đúng: B

Phân tích:

Hàm hủy (destructor) có thể là ảo (virtual). Điều này rất quan trọng trong kế thừa để đảm bảo rằng khi một đối tượng của lớp con bị xóa thông qua một con trỏ đến lớp cha, hàm hủy của cả lớp cha và lớp con đều được gọi. Nếu hàm hủy của lớp cha không phải là ảo, chỉ hàm hủy của lớp cha sẽ được gọi, dẫn đến rò rỉ bộ nhớ nếu lớp con cấp phát bộ nhớ.

Hàm tạo (constructor) không thể là ảo. Vì hàm tạo được sử dụng để tạo ra một đối tượng thuộc một lớp cụ thể, nó phải biết chính xác lớp nào cần tạo. Tính ảo (virtual) chỉ có ý nghĩa khi bạn gọi một hàm thông qua một con trỏ hoặc tham chiếu đến lớp cha, và bạn muốn hàm của lớp con được gọi nếu đối tượng thực tế là một thể hiện của lớp con.

Hàm tĩnh (static function) thuộc về lớp chứ không phải đối tượng. Vì vậy, không có khái niệm "đa hình" (polymorphism) áp dụng cho hàm tĩnh. Hàm tĩnh không thể là ảo.

Kết luận:

Đáp án đúng là B. Destructors có thể là virtual.

Danh sách câu hỏi:

Câu 1:

Which of the following can be virtual?

Lời giải:
Đáp án đúng: B

Phân tích:

Hàm hủy (destructor) có thể là ảo (virtual). Điều này rất quan trọng trong kế thừa để đảm bảo rằng khi một đối tượng của lớp con bị xóa thông qua một con trỏ đến lớp cha, hàm hủy của cả lớp cha và lớp con đều được gọi. Nếu hàm hủy của lớp cha không phải là ảo, chỉ hàm hủy của lớp cha sẽ được gọi, dẫn đến rò rỉ bộ nhớ nếu lớp con cấp phát bộ nhớ.

Hàm tạo (constructor) không thể là ảo. Vì hàm tạo được sử dụng để tạo ra một đối tượng thuộc một lớp cụ thể, nó phải biết chính xác lớp nào cần tạo. Tính ảo (virtual) chỉ có ý nghĩa khi bạn gọi một hàm thông qua một con trỏ hoặc tham chiếu đến lớp cha, và bạn muốn hàm của lớp con được gọi nếu đối tượng thực tế là một thể hiện của lớp con.

Hàm tĩnh (static function) thuộc về lớp chứ không phải đối tượng. Vì vậy, không có khái niệm "đa hình" (polymorphism) áp dụng cho hàm tĩnh. Hàm tĩnh không thể là ảo.

Kết luận:

Đáp án đúng là B. Destructors có thể là virtual.

Câu 2:

The three member access specifiers are ___, ___ and ___ .

Lời giải:
Đáp án đúng: A
Trong lập trình hướng đối tượng, đặc biệt là trong C++, các access specifiers (chỉ định truy cập) dùng để kiểm soát khả năng truy cập các thành viên (biến và hàm) của một lớp. Có ba access specifiers chính:

1. `public`: Các thành viên `public` có thể được truy cập từ bất kỳ đâu, cả bên trong và bên ngoài lớp.
2. `private`: Các thành viên `private` chỉ có thể được truy cập từ bên trong lớp đó. Các lớp hoặc hàm bên ngoài không thể truy cập trực tiếp các thành viên `private`.
3. `protected`: Các thành viên `protected` có thể được truy cập từ bên trong lớp đó và từ các lớp con (lớp kế thừa) của lớp đó. Các lớp hoặc hàm bên ngoài (không phải lớp con) không thể truy cập trực tiếp các thành viên `protected`.

Như vậy, đáp án đúng là: public, private, protected
Lời giải:
Đáp án đúng: A
STL (Standard Template Library) là một thư viện các template trong C++ cung cấp một tập hợp các container class (ví dụ: vector, list, map), các thuật toán (ví dụ: sort, find) và các iterator. Các container class này cho phép lưu trữ và quản lý các đối tượng một cách hiệu quả. Do đó, đáp án A đúng.

Các đáp án khác:
B. time class: STL không phải là thư viện các time class.
C. none of above: Vì A đúng nên C sai.
Lời giải:
Đáp án đúng: B
Trong đoạn mã C được cung cấp, hàm `display()` được gọi trước khi nó được định nghĩa. Trong C (đặc biệt là với các trình biên dịch cũ như Turbo C), nếu một hàm được gọi trước khi nó được khai báo hoặc định nghĩa, trình biên dịch sẽ giả định rằng hàm trả về một giá trị kiểu `int`. Tuy nhiên, hàm `display()` trong đoạn mã này trả về `void` (không trả về giá trị nào). Điều này dẫn đến một lỗi, vì trình biên dịch mong đợi một hàm trả về `int` nhưng lại gặp một hàm `void`. Do đó, đáp án chính xác là "display() không được khai báo" theo cách mà trình biên dịch Turbo C xử lý code.
Lời giải:
Đáp án đúng: A

Trong các ngôn ngữ lập trình, toán tử || (OR logic) thường sử dụng một kỹ thuật gọi là "short-circuit evaluation" (đánh giá đoản mạch). Điều này có nghĩa là nếu vế trái của toán tử || đã cho kết quả là true, thì vế phải sẽ không được đánh giá, vì kết quả cuối cùng chắc chắn là true bất kể giá trị của vế phải là gì. Do đó, câu phát biểu này là đúng.

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP

Câu 10:

Trong ngôn ngữ C, khai báo “int array[3][5]” có nghĩa là

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP

Câu 13:

Đâu là phát biểu đúng nhất về biến động:

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP

Câu 15:

Khi sử dụng từ khóa typedef trước định nghĩa cấu trúc thì:

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP