แบบทดสอบ

โจทย์ชุดที่ 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
ข) 1 1
2 4
1 1
2 4
1 1
2 4
ค) 1 1
2 4
1 1
2 4
1 1
ง) 1 1
2 4
1 1
1 1
2 4
จ) ไม่ได้แสดงผลลัพธ์ใดๆ - มีข้อผิดพลาดทางไวยากรณ์

คำถามที่ 2: จะเกิดอะไรขึ้นหากเรานำการเริ่มต้น "ตัวนับ" ออก ก่อนที่จะทำวนซ้ำ

ก) ลูปที่ไม่สิ้นสุด - ลูปที่ต้องทำขณะที่จะแสดงผลลัพธ์เป็น 1
ข) เอาต์พุตของโปรแกรมจะไม่เปลี่ยนแปลง
ค) เอาต์พุตแบบวนซ้ำในขณะทำงานจะเป็น 2 และ 4
ง) การวนซ้ำระหว่างดำเนินการจะไม่แสดงผลใดๆ
จ) เอาต์พุตแบบวนซ้ำที่ต้องทำขณะนั้นจะแสดงที่ 3 และ 9

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

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

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

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

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

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

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

ก) คำสั่ง ขณะที่วนซ้ำจะแสดงผลลัพธ์บางอย่าง และจะไม่แสดงผลอย่างอื่น
ข) ขณะที่ลูปจะแสดงผลลัพธ์บางอย่าง แต่ไม่มีผลลัพธ์อื่นๆ ปรากฏขึ้น
ค) การวนซ้ำแต่ละรอบจะแสดง 1 บรรทัด
ง) ขณะที่ Do ขณะที่ลูปจะแสดงเอาต์พุต 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
ข) #1: 6
#2: 3
#3: 11
#4: 3
ค) #1: 6
#2: 6
#3: 11
#4: 11
ง) และไม่แสดงผลใดๆ เนื่องจากไม่ได้คอมไพล์หรือเรียกใช้

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

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

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

int Boys = 3, Girls = 5;
ก) ซึ่งเอาต์พุตจะเหมือนเดิม
ข) เด็กผู้ชายจะ = 3 และเด็กผู้หญิงจะ = 5 ในผลลัพธ์ทั้งหมด
ค) เด็กผู้ชายจะ = 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;
ก) โปรแกรมจะรวบรวมแต่จะขัดข้องเมื่อเราลองเรียกใช้
ข) เอาต์พุตจะไม่มีการเปลี่ยนแปลง
ค) ผลลัพธ์จะเป็นเด็กผู้ชาย = ผู้หญิง 3 คน = 5 คนตลอดระยะเวลาของโปรแกรม
ง) เอาต์พุตจะเป็น Boys = 3 Girls = 5 เฉพาะในเอาต์พุตจาก main()
จ) โปรแกรมอาจไม่ได้คอมไพล์ (ขึ้นอยู่กับคอมไพเลอร์)

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

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


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

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

#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
ข) 1 2 3 4
5 6 7 8
9 10 11 12
ค) 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) และไม่แสดงผลลัพธ์ใดๆ - มีข้อผิดพลาดทางไวยากรณ์
J) ซึ่งไม่ได้แสดงผลลัพธ์ใดๆ แต่ไม่เป็นอย่างที่ควร
พัน) โดยจะแสดงผลตัวเลข 12 ตัวแรกที่นึกถึงในขณะที่คุณกำลังรอให้โปรแกรมทำงาน

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

MAX_SIZE = 10;
ก) ซึ่งไม่อนุญาตใน C++
ข) เราอนุญาต โปรแกรมจะทำงานโดยมี MAX_SIZE ที่ตั้งค่าเป็น 20
ค) เราอนุญาต โปรแกรมจะทำงานโดยมี 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) ใช่
ข) 1) ไม่ควร 2) ไม่
ค) 1) ไม่ใช่ 2) ใช่
ง) 1) ใช่ 2) ไม่ใช่

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

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

Question 5: typedef ใช้เพื่อสร้างชื่อแทนสำหรับชื่อประเภท

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

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

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

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

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

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

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

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

ก) สามารถทำได้
ข) โดยต้องประกาศตัวแปรทั้งหมดที่ด้านบนของฟังก์ชัน
ค) ทั้งสองวิธีนี้ไม่ถูกต้อง - 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
Betsy หนัก 400 มีค่า 0 และพูดว่า MOO
ข) Betsy พูดว่า MOO
Betsy หนัก 400 ตัวดำและพูดว่า MOO
ค) Betsy พูดว่า MOO
betsy หนัก 400

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

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

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

ก) ไม่ใช่ - เนื่องจากมี cow.h ด้วย
ข) ใช่

คำถามที่ 4: บทบาทหน้าที่:

#ifndef COW_H
#define COW_H
...
#endif

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

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

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

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

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

คำถามที่ 6: เมื่อมีการดำเนินการกับบรรทัดต่อไปนี้ เครื่องมือสร้างในคลาส Cow จะถูกเรียก:

Cow cow1;

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

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

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

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

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

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

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

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

คำถามที่ 9: จะเกิดอะไรขึ้นหากเราเพิ่มตัวสร้างอื่นนอกเหนือไปจาก เราต้องว้าว.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 จะขัดข้อง
ข) เรามีตัวสร้างได้เพียงรายการเดียว
ค) กรณีนี้พบได้บ่อยใน C++
ง) ใช่ แต่นี่ไม่ใช่การใช้งาน C++ ตามปกติ
จ) คำสั่งนี้จะทำงานได้ แต่จะไม่แสดงข้อมูลใดๆ เพราะ จะไม่มีการเริ่มต้น "ส่วนตัว"
ฉ) เราไม่สามารถเรียก setName(), setColor() และ setweight() จากภายใน วิธีการของชั้นเรียนเดียวกัน


คำถามพิเศษ

คำถามที่ 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_instance ดังต่อไปนี้

Apple* granny_smith = new Apple; 

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

ก) Apple* granny_smith = NULL; if (granny_smith == NULL)... ค่านี้ไม่ใช่ - NULL ไม่ใช่ค่าที่สามารถตรวจสอบได้ในลักษณะนี้
ข) Apple* granny_smith, fuji; การดำเนินการนี้จะประกาศเคอร์เซอร์ 2 ตัวไปยังออบเจ็กต์ Apple
ค) ตัวแปร 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;
}


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

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

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