แบบทดสอบ

ชุดโจทย์ข้อที่ 1

ศึกษาโปรแกรมต่อไปนี้แล้วตอบคำถามด้านล่าง เราต้องการให้คุณตอบคำถามโดยดูเฉพาะซอร์สโค้ด กล่าวคือ โปรดอย่าคัดลอกลงในไฟล์ ให้คอมไพล์และตอบคำถามตามการเรียกใช้โค้ด วิธีนี้ทำให้ความสนุกทั้งหมดเป็นเรื่องง่าย

int main() {
  int counter, first, last, next;
  first = 1; last = 2;

  for (counter = first; counter <= last; counter++) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
  }

  counter = first;
  while (counter <= last) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  }

  counter = first;
  do {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  } while (counter < last);
}

คำถามที่ 1: ผลลัพธ์ของโปรแกรมนี้คืออะไร

ก) 1 2
2 4
1 2
2 4
1 2
2 4
B) 1 1
2 4
1 1
2 4
1 1
2 4
C) 1 1
2 4
1 1
2 4
1 1
ง) 1 1
2 4
1 1
1 1
2 4
จ) โดยไม่แสดงผลสิ่งใดเลย เนื่องจากมีข้อผิดพลาดทางไวยากรณ์

คำถามที่ 2: จะเกิดอะไรขึ้นหากเรานำการเริ่มต้น "counter" ออกก่อนลูป "Do-With"

ก) ลูปที่ไม่สิ้นสุด - ลูป "ทำขณะ" จะแสดงผลชุดของ 1
B) เอาต์พุตของโปรแกรมจะไม่เปลี่ยนแปลง
C) ลูป "ทำระหว่างดำเนินการ" จะมีเอาต์พุตเป็น 2 และ 4
ง) ลูป "ทำขณะ" จะไม่แสดงอะไรเลย
จ) ลูป "ทำก่อน" จะมีเอาต์พุตเป็น 3 และ 9

คำถามที่ 3: จากโปรแกรมเดิมที่ด้านบนของหน้านี้ สมมติว่าเราลบบรรทัดที่เริ่มต้นตัวแปรตัวนับก่อนวงกลมขณะวนซ้ำ จะเกิดอะไรขึ้นหากเรานำบรรทัด counter++ ภายในขณะลูปออกด้วย ดังตัวอย่างต่อไปนี้

ก) การวนซ้ำขณะไม่แสดงผล
B) การวนซ้ำคำสั่งจะเอาต์พุต 1 และ 1 ส่วนลูป "ทำขณะ" จะไม่แสดงข้อมูลอะไรเลย
C) เอาต์พุตของลูปขณะเหมือนกันเมื่อรวมทั้ง 2 บรรทัด
ง) ระบบจะแสดงตัวเลขแบบสุ่มจนกว่าเราจะปิดคอมพิวเตอร์
จ) ลูปขณะเป็นการวนซ้ำที่ไม่มีที่สิ้นสุด

คำถามที่ 4: จากโปรแกรมเดิมที่ด้านบนของหน้านี้ จะเกิดอะไรขึ้น หากลูปมีลักษณะดังนี้

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
ก) เอาต์พุตของลูปขณะจะเหมือนกับในโปรแกรมต้นฉบับ
B) การวนซ้ำขณะจะไม่แสดงข้อมูลใดๆ
C) เอาต์พุตของลูปขณะคือ 1 1 และ 1 4
ง) เอาต์พุตของลูปขณะคือ 1 2 และ 2 4
จ) เอาต์พุตของลูปขณะคือ 1 4 และ 2 4
ฉ) เอาต์พุตของลูปขณะคือ 2 4 และ 2 4

คำถามที่ 5: จะเกิดอะไรขึ้นหากตัวแปรแรกมากกว่าตัวแปรสุดท้าย

ก) ขณะที่ลูปจะแสดงผลบางอย่าง แต่ไม่ส่งออกไปที่อื่น
B) คำสั่งทำขณะวนซ้ำจะแสดงผลลัพธ์บางอย่าง แต่ไม่แสดงผลลัพธ์อื่น
C) จะไม่มีเอาต์พุตเลย
ง) โปรแกรมจะแยกความผิดหรือข้อขัดข้อง
จ) For-loop จะแสดงบางอย่าง แต่ไม่แสดงผลลัพธ์

คำถามที่ 6: โปรแกรมจะได้ผลลัพธ์เป็นอย่างไรหากเราเริ่มต้นตัวแปรแรกให้เหมือนกับตัวแปรตัวสุดท้าย

ก) คำสั่งทำขณะวนซ้ำจะแสดงผลลัพธ์บางอย่าง แต่ไม่แสดงผลลัพธ์อื่น
B) ขณะที่ลูปจะแสดงผลบางอย่าง แต่ไม่ส่งออกไปที่อื่น
C) แต่ละวนซ้ำจะแสดง 1 บรรทัด
ง) การดำเนินการวนลูปจะแสดงผล 2 บรรทัด และลูปอีกบรรทัดหนึ่งจะวนซ้ำ 1 บรรทัด
จ) จะไม่มีการแสดงผลลัพธ์ใดๆ
ฉ) For-loop จะแสดงบางอย่าง แต่ไม่แสดงผลลัพธ์


ชุดโจทย์ข้อที่ 2

นี่เป็นโปรแกรมที่คุณควรพิจารณาเช่นเดียวกับในชุดปัญหาก่อนหน้า โปรดตอบคำถามที่ตามมาโดยดูเฉพาะซอร์สโค้ด

#include <iostream>
using namespace std;

int main() {
  int Boys = 3, Girls = 5;
  void F1(int males, int females);
  void F2(int &m, int &f);

  F1(Boys, Girls);
  cout << "\nAfter calling F1, within main()";
  cout << "\n\tBoys = " << Boys; // #2
  cout << "\n\tGirls = " << Girls;

  F2(Boys, Girls);
  cout << "\nAfter calling F2, within main()";
  cout << "\n\tBoys = " << Boys; // #4
  cout << "\n\tGirls = " << Girls;
}

void F1(int b, int g) {
  b += 3, g += 4;
  cout << "\nF1";
  cout << "\n\tBoys = " << b; // #1
  cout << "\n\tGirls = " << g;
}

void F2(int &b, int &g) {
  b = b + 8, g = g + 5;
  cout << "\nF2";
  cout << "\n\tBoys = " << b; // #3
  cout << "\n\tGirls = " << g;
}

คำถามที่ 1: เอาต์พุตของตัวแปร Boys ในบรรทัดที่ทำเครื่องหมายคืออะไร

ก) #1: 6
#2: 3
#3: 11
#4: 11
B) #1: 6
#2: 3
#3: 11
#4: 3
C) #1: 6
#2: 6
#3: 11
#4: 11
ง) ซึ่งจะไม่แสดงผลใดๆ เนื่องจากไม่มีการคอมไพล์หรือเรียกใช้

คำถามที่ 2: เลือกทุกข้อที่เกี่ยวข้องกับบรรทัดต่อไปนี้ของโปรแกรม

void F1(int males, int females);
void F2(int &m, int &f);
ก) โดยกฎ C++ ระบุว่าเรานำ 2 บรรทัดนี้ออกได้ ตราบใดที่มีการกำหนดวิธีการก่อนใช้งาน
B) โดยกฎ C++ จะระบุว่าชื่ออาร์กิวเมนต์ต้องเหมือนกันระหว่างการประกาศและคำจำกัดความ
C) โปรแกรมนี้จะขัดข้องหากเรานำ 2 บรรทัดนี้ออก
ง) การประกาศในขอบเขตส่วนกลางถือเป็นเรื่องปกติ
จ) ซึ่งเรียกว่าการประกาศส่งต่อ

คำถามที่ 3: หากเราย้ายบรรทัดต่อไปนี้จาก main() และวางไว้ในขอบเขตทั่วโลก จะเกิดอะไรขึ้น

int Boys = 3, Girls = 5;
ก) ผลลัพธ์จะเหมือนกัน
B) เด็กผู้ชายจะ = 3 และเด็กผู้หญิงจะ = 5 ในเอาต์พุตทั้งหมด
C) เด็กผู้ชายจะ = 3 และเด็กผู้หญิงจะ = 5 เฉพาะในเอาต์พุตจาก main()

คำถามที่ 4: จะเป็นอย่างไรหากเราเปลี่ยนตอนต้นของโปรแกรมให้มีลักษณะเช่นนี้

// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;

void main() {
  //int Boys = 3, Girls = 5;
ก) โปรแกรมจะคอมไพล์ แต่จะขัดข้องเมื่อเราพยายามเรียกใช้
B) เอาต์พุตนี้จะไม่มีการเปลี่ยนแปลง
C) ผลลัพธ์ที่ได้จะเป็นเด็กผู้ชาย = เด็กผู้หญิง 3 คน = 5 ตลอดระยะเวลาของโปรแกรม
ง) เอาต์พุตจะเป็น Boys = 3 Girls = 5 เฉพาะในเอาต์พุตจาก main() เท่านั้น
จ) โปรแกรมอาจไม่คอมไพล์ (ขึ้นอยู่กับคอมไพเลอร์)

คำถามที่ 5: มีการส่งข้อมูลโดยค่าในหน่วย F2

ก) จริง
B) เท็จ


ชุดโจทย์ข้อที่ 3

นี่เป็นโปรแกรมที่คุณควรพิจารณาเช่นเดียวกับในชุดปัญหาก่อนหน้า โปรดตอบคำถามที่ตามมาโดยดูเฉพาะซอร์สโค้ดส่วนนี้น่าสนใจกว่า 2 รายการก่อนหน้า - ติดตามโค้ดอย่างละเอียด

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];

void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);

int main() {
  ARR2D matrix;
  int row, col;
  do {
    cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
    cin >> row >> col;
  } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
  Fill(matrix, row, col);
  Print(matrix, row, col);
  return(0);
}

void Print(ARR2D in_array, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++)
      cout << '\t' << in_array[i][j];
    cout << endl;
  }
}

void Fill(ARR2D in_array, int rows, int cols) {
  for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      in_array[i][j] = 0;

  const int limit = rows * cols;
  int cNum = 1;
  int cRow = 0;
  int cCol = 0;
  int cDir = 0;  // 0-north, 1-east, 2-south, 3-west

  while(true) {
    // Place the number.
    in_array[cRow][cCol] = cNum;
    cNum++;
    if (cNum > limit) break;

    int fRow = cRow;
    int fCol = cCol;
    while (true) {
      fRow = cRow;
      fCol = cCol;
      switch(cDir) {
        case 0: fRow--; break;
        case 1: fCol++; break;
        case 2: fRow++; break;
        case 3: fCol--; break;
      }

      if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
        break;
      cDir = (cDir + 1) % 4;
    }
    cRow = fRow;
    cCol = fCol;
  }
}

คำถามที่ 1: โปรแกรมนี้ให้อินพุตเป็น 3 สำหรับแถว และ 4 สำหรับคอลัมน์

ก) 1 2 3
4 5 6
7 8 9
10 11 12
B) 1 2 3 4
5 6 7 8
9 10 11 12
C) 12 11 10 9
8 7 6 5
4 3 2 1
ง) 1 3 2 4
8 6 7 5
9 11 10 12
จ) 1 2 3 4
10 11 12 5
9 8 7 6
ช) 9 8 7 6
10 11 12 5
1 2 3 4
ซ) โปรแกรมไม่แสดงข้อมูล - ตรรกะนี้มีข้อผิดพลาด
1) ไม่แสดงข้อมูลใดๆ เนื่องจากมีข้อผิดพลาดทางไวยากรณ์
จ) ระบบไม่ส่งออกอะไรเลย ซึ่งไม่ควรจะเป็น
พ) โดยจะแสดงผลตัวเลข 12 ตัวแรกที่นึกถึงเมื่อคุณรอให้โปรแกรมทำงาน

คำถามที่ 2: จะเป็นอย่างไรหากเราเพิ่มบรรทัดต่อไปนี้ลงในฟังก์ชัน main() ของเรา

MAX_SIZE = 10;
ก) ไม่อนุญาตให้ใช้ใน C++
B) ได้รับอนุญาต โปรแกรมจะทำงานโดยตั้งค่า MAX_SIZE เป็น 20
C) ค่านี้ได้รับอนุญาต โปรแกรมจะทำงานโดยตั้งค่า MAX_SIZE เป็น 10

คำถามที่ 3: พิจารณา 4 บรรทัดต่อไปนี้จากโปรแกรมด้านบน

const int MAX_SIZE = 20;
typedef int ARR2D [MAX_SIZE][MAX_SIZE];

void Print  (ARR2D A, int rows, int cols);
void Fill   (ARR2D A, int rows, int cols);

1) สามารถใช้ Const ใน Typedef ได้ไหม
2) เป็นไปได้ไหมที่จะใช้ typedef ในการประกาศก่อนที่จะมีการประกาศตัวแปรประเภทนั้น

ก) 1) ได้ 2) ได้
B) 1) ไม่เห็น 2) ไม่เคย
C) 1) ไม่ได้ 2) ใช่
ง) 1) ได้ 2) ไม่ได้

คำถามที่ 4: เราใช้สิ่งต่อไปนี้ได้ไหม

#define MAX_SIZE 20
แทน:
const int MAX_SIZE = 20;
ก) ใช่ ใช้งานได้ และสามารถใช้ #define สำหรับค่าคงที่ใน C++ ได้
B) ได้ วิธีนี้ได้ผลแต่เรามักจะไม่ใช้ #define สำหรับค่าคงที่ใน C++
C) #define ใช้ไม่ได้ใน C++
ง) คุณทำสิ่งเหล่านี้ในโหมด C ไม่ได้

คำถามที่ 5: typedef ใช้ในการสร้างชื่อแทนสำหรับชื่อประเภท

ก) จริง
B) เท็จ

คำถามที่ 6: จะเกิดอะไรขึ้นหากเราไม่กำหนดค่าเริ่มต้นของอาร์เรย์เป็น 0 ในฟังก์ชันFill()

ก) โปรแกรมจะทำงานแต่เอาต์พุตจะเป็น 12
B) ตัวแปรจะทำงานได้ปกติและสร้างเอาต์พุตเดียวกับที่เริ่มต้นอาร์เรย์เป็น 0
C) โปรแกรมจะไม่ทำงานหรือเกิดข้อขัดข้อง
ง) โปรแกรมจะทำงานแต่เอาต์พุตจะเป็น 0 ทั้งหมด
จ) โปรแกรมจะทำงานแต่ไม่สร้างเอาต์พุตใดๆ

คำถามที่ 7: เลือกได้หลายคำตอบ ทำไมเราต้องใช้ค่าคงที่สำหรับ MAX_SIZE ในโปรแกรมนี้ ง่ายกว่าพิมพ์ "20" แทนที่จะเป็น MAX_SIZE ในทุกที่ที่ต้องการไหม

ก) MAX_SIZE เป็นค่า C++ ในตัวที่ทุกคนใช้ได้ เพียงตั้งค่าและใช้งาน
B) ควรหลีกเลี่ยงค่าคงที่ร่วมเหมือนกับตัวแปรร่วม
C) การใช้ Const ช่วยให้เข้าใจโปรแกรมได้ง่ายขึ้น
ง) ตัวเลขมหัศจรรย์ในโปรแกรมถือเป็นแนวทางปฏิบัติที่ดี
จ) หากต้องการเปลี่ยน MAX_SIZE เราสามารถเปลี่ยนได้ในที่เดียว

คำถามที่ 8: คำสั่ง Switch ในฟังก์ชัน Fill() ควรมีกรณีเริ่มต้น เพราะถือเป็นรูปแบบที่ดีที่จะรวมกรณีหนึ่ง

ก) จริง
B) เท็จ

คำถามที่ 9: โปรดสังเกตในฟังก์ชัน Fill() เราจะประกาศตัวแปรระหว่างคำสั่ง ตัวอย่างเช่น cNum และ cRow จะมีการประกาศและเริ่มต้นหลังจากเรียกใช้ for-loop ฟังก์ชันนี้จะทำงานใน C++ ไหม หรือต้องมีการประกาศตัวแปรทั้งหมดที่ด้านบนของฟังก์ชัน

ก) ซึ่งไม่เป็นไร
B) ต้องประกาศตัวแปรทั้งหมดที่ด้านบนของฟังก์ชัน
C) ทั้ง 2 อย่างไม่ถูกต้อง - C++ ไม่อนุญาตให้มีตัวแปรใดๆ ในโปรแกรม
ง) ต้องประกาศตัวแปรทั้งหมดในขอบเขตรวม

ชุดโจทย์ที่ 4

ต่อไปนี้คือชุดไฟล์ที่กําหนดและทดสอบคลาสแบบง่าย ตามปกติ ให้ตอบคำถามที่ตามมาด้วยการอ้างถึงซอร์สโค้ดเท่านั้น

ไฟล์ส่วนหัว (cow.h) มีดังนี้

#ifndef COW_H
#define COW_H

using namespace std;

typedef enum Color {black, brown, beige, blackandwhite, nocolor};

class Cow {
 public:
  Cow();
  ~Cow();

  // accessors
  double weight() { return weight_; };
  string name() { return name_; };
  Color color() { return color_; };

  // mutators
  void set_name(string inName) { name_ = inName; };
  void set_color(Color inColor) { color_ = inColor; };
  void set_weight(double inWeight) {weight_ = inWeight; };

  void Moo();
  void Properties();

 private:
  Color color_;
  double weight_;
  string name_;
};

#endif

ต่อไปนี้คือไฟล์ .cc (cow.cc) ที่เกี่ยวข้อง

#include <iostream>
#include "cow.h"

using namespace std;

Cow::Cow() {}

Cow::~Cow() {}

void Cow::Moo() {
  cout << name() << " says MOO." << endl;
}

void Cow::Properties() {
  cout << name() << " weighs " << weight() << ", is "
       << color() << " and says MOO." << endl;
}

และนี่คือโปรแกรมลูกค้าสำหรับชั้นเรียนนี้ (cowmain.cc):

#include <iostream>
#include "cow.h"

using namespace std;

int main() {
  Cow cow1;
  cow1.set_name("betsy");
  cow1.set_weight(400.0);
  cow1.set_color(black);

  cow1.Moo();
  cow1.Properties();
}

คำถามที่ 1: โปรแกรมนี้ให้ผลอย่างไร

ก) Betsy กล่าวไว้ว่า MOO
เบ็ตซี่หนัก 400 เท่ากับ 0 และบอกว่า MOO
B) Betsy กล่าวไว้ว่า MOO
เบ็ตซี่หนัก 400 เป็นสีดำและเขียนว่า MOO
C) Betsy กล่าวไว้ว่า MOO
betsy หนัก 400 คือ

คำถามที่ 2: เราไม่ควรวางโค้ดสำหรับเมธอดตัวเข้าถึงและเปลี่ยนแปลงในไฟล์ส่วนหัว (โปรดทราบว่าตัวเข้าถึงคือเมธอดที่แสดงผลค่า ส่วนการเปลี่ยนแปลงคือเมธอดที่แก้ไขค่า)

ก) จริง
B) เท็จ

คำถามที่ 3: เราต้องใส่ "Cow:" ก่อนคำจำกัดความฟังก์ชันแต่ละรายการใน cow.cc หรือไม่

ก) ไม่ - เนื่องจากมี cow.h
B) มี

คำถามที่ 4: หน้าที่ต้องทำ

#ifndef COW_H
#define COW_H
...
#endif

เล่นในไฟล์ส่วนหัวได้ไหม

เลือกได้หลายคำตอบ

ก) ไฟล์เหล่านี้ไม่มีจุดประสงค์เพราะชื่อไฟล์คือ cow.h ไม่ใช่ COW_H
B) เราอาจพบข้อผิดพลาดรันไทม์หากเราไม่ดำเนินการ
C) หากไม่ดำเนินการนี้ เราอาจรวมไฟล์มากกว่า 1 ครั้ง
ง) พวกเขาไม่ดำเนินการใดๆ เนื่องจากมีการสะกดคีย์เวิร์ดอย่างน้อย 1 คำผิด
จ) ไม่ดำเนินการใดๆ เนื่องจากคลาส Cow มีส่วนหัวเพียง 1 ไฟล์

คำถามที่ 5: จะเกิดอะไรขึ้นหากเราเพิ่มบรรทัดต่อไปนี้ใน cowmain.cc

cow1.weight_ = 24;
ก) โปรแกรมจะทำงาน และตัวแปรน้ำหนักจะได้รับการแก้ไขโดยบรรทัดนี้
B) โปรแกรมคอมไพล์และเรียกใช้ แต่จะขัดข้องในบรรทัดนั้น
C) C++ ไม่อนุญาตการดำเนินการนี้
ง) โปรแกรมจะรวบรวมและเรียกใช้ แต่บรรทัดนี้จะไม่เปลี่ยนแปลงตัวแปรน้ำหนัก

คำถามที่ 6: เมื่อมีการเรียกใช้บรรทัดต่อไปนี้ ตัวสร้างในคลาส "วัว":

Cow cow1;

ลักษณะที่สำคัญของผู้สร้างมีอะไรบ้าง

เลือกได้หลายคำตอบ

ก) โดยมักจะไม่แสดงค่าใดๆ
B) หากเราไม่ได้ให้ตัวสร้างในชั้นเรียน ชั้นเรียนก็จะไม่คอมไพล์
C) ตัวสร้างในคลาส Cow นั้นผิดปกติเพราะไม่ได้กำหนดค่าเริ่มต้นตัวแปรส่วนตัว
ง) จะมีชื่อเหมือนกับชั้นเรียนเสมอ
จ) เรามีตัวสร้างได้หลายรายการในคลาสตราบใดที่อาร์กิวเมนต์แตกต่างกัน
ฉ) จะมีการเรียกใช้ตัวสร้างเมื่อคลาสสร้างขึ้น

คำถามที่ 7: ลักษณะที่สำคัญบางอย่างของผู้ทำลายคืออะไร

ก) ระบบจะเรียกตัวทำลายเมื่อออบเจ็กต์ออกนอกขอบเขต
B) ตัวทำลายมีชื่อเหมือนกับคลาส แต่ขึ้นต้นด้วย "~"
C) ตัวทำลายใน cow.cc มีบางอย่างผิดพลาดตรงที่ตัวทำลายนั้นไม่ได้ทำอะไร
ง) หากเราไม่สร้างตัวทำลายชั้นเรียน ชั้นเรียนก็จะไม่คอมไพล์

คำถามที่ 8: จากวิธีที่โปรแกรมลูกค้าใช้คลาส โปรดพิจารณาสิ่งต่อไปนี้

การแบ่งสมาชิกเป็นแบบสาธารณะและส่วนตัวในคลาส Cow นั้นไม่เหมาะสม นั่นคือ สิ่งที่เป็นข้อมูลส่วนตัวควรเป็นสาธารณะ หรือสิ่งที่เป็นสาธารณะควรเป็นแบบส่วนตัว

ก) จริง
B) เท็จ

คำถามที่ 9: จะเกิดอะไรขึ้นหากเราเพิ่มตัวสร้างอีกตัวนอกเหนือจากตัวสร้างที่เราต้อง cow.cc ตัวสร้างใหม่จะมีลักษณะดังนี้

Cow::Cow(string inName, double inWeight, Color inColor) {
  set_name(inName);
  set_weight(inWeight);
  set_color(inColor);
}

และเราจะเพิ่มบรรทัดต่อไปนี้ลงใน main():

Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();

เราสามารถทำได้หรือไม่

เลือกได้หลายคำตอบ

ก) บรรทัดใน main() ที่เราเริ่มต้น cow2 จะขัดข้อง
B) เรามีตัวสร้างได้เพียงรายการเดียว
C) กรณีนี้พบได้บ่อยใน C++
ง) ใช่ แต่นี่ไม่ใช่การใช้งาน C++ ทั่วไป
จ) การดำเนินการนี้จะทำงานได้ปกติ แต่จะไม่แสดงผลใดๆ เนื่องจากคีย์ส่วนตัวไม่ได้เริ่มต้น
ฉ) เราไม่สามารถเรียก setName(), setColor() และ setน้ำหนัก() จากในเมธอดของคลาสเดียวกัน


คำถามโบนัส

คำถามที่ 1) คำถามจะออกมาเป็นอย่างไร

#include <iostream>
using namespace std;

void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);

void HelpMe(int *p, int *num, int *q) {
  int a;

  a = 2;
  q = &a;
  *p = *q + *num;
  num = p;
}


void WhereAmI(int *p, int *q, int a) {
  a = 6;
  *p = a + *p;
  *q = a + 3;
  HelpMe(q, &a, p);
}


int main() {
  int *p;
  int q;
  int *num;
  int a;

  a = 3;
  q = 5;
  p = &a;
  num = &q;

  HelpMe(&a, p, num);
  WhereAmI(&q, p, *num);

  cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
 

คำถามที่ 2) โปรดพิจารณาข้อความต่อไปนี้ โดยสมมติว่ามีคลาส Apple มีอยู่แล้วและได้มีการเริ่มต้นแล้ว คลาส Apple มีตัวแปรอินสแตนซ์ color_ ดังนี้

Apple* granny_smith = new Apple; 

เลือกทุกข้อความด้านล่างนี้เป็นจริง

ก) Apple* granny_smith = NULL; if (granny_smith == NULL)... กรณีนี้ "ไม่" ใช้ได้ เนื่องจาก NULL ไม่ใช่ค่าที่สามารถตรวจสอบได้ในลักษณะนี้
B) Apple* granny_smith, fuji; ประกาศตัวชี้ 2 จุดไปยังวัตถุของ Apple
C) ตัวแปร granny_smith มีค่าตัวแปรอินสแตนซ์ที่เชื่อมโยงกับออบเจ็กต์ Apple
ง) Apple* granny_smith = NULL
จ) ตัวแปร granny_smith มีที่อยู่สำหรับออบเจ็กต์ Apple
ฉ) string gs_color = *(granny_smith.get_color(อย่างใดอย่างหนึ่ง) คำสั่งนี้จะแสดงสีของออบเจ็กต์ granny_smith โดยสมมติว่าคุณได้เริ่มต้นแล้ว
ช) พื้นที่เก็บข้อมูลสำหรับออบเจ็กต์ Apple ใหม่จะได้รับการจัดสรรในฮีป
ซ) พื้นที่เก็บข้อมูลสำหรับออบเจ็กต์ Apple ใหม่ได้รับการจัดสรรในสแต็กรันไทม์
1) int* a = &b; ใส่ที่อยู่ของ b ลงใน a


คำถามที่ 3) โปรแกรมต่อไปนี้จะออกมาเป็นอย่างไร

#include <iostream>
using namespace std;

const int kNumVeggies = 4;

void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);


void Grill(int squash, int *mushroom) {
  *mushroom = squash/4;
  cout << *mushroom + squash << endl;
}

int Saute(int onions[], int celery) {
  celery *= 2;
  onions[celery]++;
  Grill(onions[0], &onions[3]);
  cout << celery << " " << onions[3] << endl;
  return celery;
}

int main() {
  int broccoli, peppers[kNumVeggies], *zucchini;

  for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
    peppers[broccoli] = kNumVeggies - broccoli;
  zucchini = &peppers[Saute(peppers,1)];
  Grill(*zucchini, zucchini);
  zucchini--;
  cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}


คำตอบในแบบทดสอบ

คุณควรพยายามตอบคำถามด้านบนทั้งหมดโดยไม่ดูคำตอบ คุณควรขอความช่วยเหลือจากผู้อื่น แทนที่จะไปยังแผ่นคำตอบเพื่อขอความช่วยเหลือโดยตรง

คุณสามารถดูคำตอบของปัญหาข้างต้นได้ที่นี่