C++問題集_クラスの基本2
クラスの基本2
問題1 コンストラクタのオーバーロード
①Studentクラスを作成。
Studentクラスには、privateなメンバ変数として名前、身長、体重を登録できるものとする。
メンバ変数にはメンバ関数にてアクセスするものとする。
Studentクラスのコンストラクタを2つ用意(「引数なしの場合、名前を「名無しさん」、身長165cm、体重58kgに設定するコンストラクタ」と
「引数3つの場合、引数をそれぞれ名前・身長・体重に設定するコンストラクタ」)
②main関数内にて、コンストラクタにて引数なしのオブジェクトtaro、引数ありのオブジェクトjiro(名前「次郎」、身長168センチ、体重72キロ)を生成する。
③Studentクラスとは関係ない独自のshow関数を作成し、②で設定したtaroとjiroの情報を出力せよ。
【実行結果】
$ prac2_1 生徒 : 名無しさん 165cm 58kg 生徒 : 次郎 168cm 72kg $
【答え】
#include <iostream> #include <string> using namespace std; class Student { private: string name; int height; int weight; public: Student(); Student(string n, int h, int w); string get_name(); int get_height(); int get_weight(); }; Student::Student(){ name = "名無しさん"; height = 165; weight = 58; } Student::Student(string n, int h, int w){ name = n; height = h; weight = w; } string Student::get_name() { return name; } int Student::get_height(){ return height; } int Student::get_weight(){ return weight; } void show(Student s){ cout << "生徒 : " << s.get_name() << " " << s.get_height() << "cm " << s.get_weight() << "kg" << endl; } int main(){ Student taro; Student jiro("次郎",168, 72); // 以下でも可能 この場合、右辺(「Student()」、「Student("次郎",168, 72)」)は // <span style="color: #ff0000">一時オブジェクト</span>となる。 // Student taro = Student(); // Student jiro = Student("次郎",168, 72); show(taro); show(jiro); return 0; }
問題2 デフォルトコンストラクタ
例えば問題1のような場合にコンストラクタを一つも定義しなかった場合、どうなるか?
【答え】
コンパイラが用意するデフォルトコンストラクタが呼ばれる。
デフォルトコンストラクタは引数を取らず、何の処理も行わない。
問題3 配列を使ったオブジェクトの生成
①Studentクラスを作成。
Studentクラスには、privateなメンバ変数として名前、身長、体重を登録できるものとする。
メンバ変数にはメンバ関数にてアクセスするものとする。
Studentクラスのコンストラクタを2つ用意(「引数なしの場合、名前を「名無しさん」、身長165cm、体重58kgに設定するコンストラクタ」と
「引数3つの場合、引数をそれぞれ名前・身長・体重に設定するコンストラクタ」)
②main関数内にて、要素数3のStudentクラスの配列を作成し、その配列に順に引数なしコンストラクタを呼ぶ一時オブジェクト、引数3つのコンストラクタを呼ぶ一時オブジェクト(名前「次郎」、身長168センチ、体重72キロ)、同じく引数3つのコンストラクタを呼ぶ一時オブジェクト(名前「三郎」、身長176センチ、体重85キロ)を格納する。
③Studentクラスとは関係ない独自のshow関数を作成し、②で設定した各オブジェクトの情報を出力せよ。
【実行結果】
$ prac3 生徒 : 名無しさん 165cm 58kg 生徒 : 次郎 168cm 72kg 生徒 : 三郎 176cm 85kg $
【答え】
#include <iostream> #include <string> #include <iomanip> using namespace std; class Student { private: string name; int height; int weight; public: Student(); Student(string n, int h, int w); string get_name(); int get_height(); int get_weight(); }; Student::Student(){ name = "名無しさん"; height = 165; weight = 58; } Student::Student(string n, int h, int w){ name = n; height = h; weight = w; } string Student::get_name() { return name; } int Student::get_height(){ return height; } int Student::get_weight(){ return weight; } void show(Student s){ cout << "生徒 : " << s.get_name() << " " << s.get_height() << "cm " << s.get_weight() << "kg" << endl; } int main(){ Student students[3] = { Student(), Student("次郎", 168, 72), Student("三郎", 176, 85) }; show(students[0]); show(students[1]); show(students[2]); return 0; }
問題4 デフォルト引数
問題3について、引数無しのコンストラクタを定義しない、より簡素なプログラムを作れ。
【実行結果】
$ prac4 生徒 : 名無しさん 165cm 58kg 生徒 : 次郎 168cm 72kg 生徒 : 三郎 176cm 85kg $
【答え】
#include <iostream> #include <string> #include <iomanip> using namespace std; class Student { private: string name; int height; int weight; public: Student(string n = "名無しさん", int h = 165, int w = 58); string get_name(); int get_height(); int get_weight(); }; Student::Student(string n, int h, int w){ name = n; height = h; weight = w; } string Student::get_name() { return name; } int Student::get_height(){ return height; } int Student::get_weight(){ return weight; } void show(Student s){ cout << "生徒 : " << s.get_name() << " " << s.get_height() << "cm " << s.get_weight() << "kg" << endl; } int main(){ Student students[3] = { Student(), Student("次郎", 168, 72), Student("三郎", 176, 85) }; show(students[0]); show(students[1]); show(students[2]); return 0; }
問題5 静的メンバの利用
問題
①Studentクラスを作成。
Studentクラスには、privateなメンバ変数として名前、身長、体重を登録できるものとする。
メンバ変数にはメンバ関数にてアクセスするものとする。
Studentクラスのコンストラクタを1つ用意(「引数3つの場合、引数をそれぞれ名前・身長・体重に設定するコンストラクタ」のみ。引数無しのコンストラクタは定義せず、引数なしの場合、名前を「名無しさん」、身長165cm、体重58kgに設定する)
Studentクラスにて生徒番号を管理できるように変数Num(初期値0)を用意し、生徒の情報を出力する際に変数Numを用いたshowNo関数にて生徒番号を出力できるようにせよ。
②main関数内にて、要素数3のStudentクラスの配列を作成し、その配列に順に引数なしコンストラクタを呼ぶ一時オブジェクト、引数3つのコンストラクタを呼ぶ一時オブジェクト(名前「次郎」、身長168センチ、体重72キロ)、同じく引数3つのコンストラクタを呼ぶ一時オブジェクト(名前「三郎」、身長176センチ、体重85キロ)を格納する。
③Studentクラスとは関係ない独自のshow関数を作成し、②で設定した各オブジェクトの情報を出力せよ。(①で用意したshowNo関数を用いて生徒番号を出力すること)
【実行結果】
$ prac5 生徒番号 : 1 生徒 : 名無しさん 165cm 58kg 生徒番号 : 2 生徒 : 次郎 168cm 72kg 生徒番号 : 3 生徒 : 三郎 176cm 85kg $
【答え】
#include <iostream> #include <string> using namespace std; class Student { private: string name; int height; int weight; public: static int Num; Student(string n = "名無しさん", int h = 165, int w = 58); string get_name(); int get_height(); int get_weight(); static void showNo(); // Studentクラスのオブジェクトがなくても呼び出せる。 }; Student::Student(string n, int h, int w){ name = n; height = h; weight = w; } string Student::get_name() { return name; } int Student::get_height(){ return height; } int Student::get_weight(){ return weight; } void Student::showNo(){ Num++; cout << "生徒番号 : " << Num << endl; // オブジェクトが無くても呼び出せる関数であるため、staticでない(オブジェクトに関連づけられた)変数は呼び出せない // <誤り> cout << get_name() << endl; // <誤り> cout << height << endl; } void show(Student s){ Student::showNo(); // staticなメンバ関数なので、Studentクラスのオブジェクトが無くても実行できる // ただし、Studentクラスの関数であることを明示するために「Student::」が必要 cout << "生徒 : " << s.get_name() << " " << s.get_height() << "cm " << s.get_weight() << "kg" << endl; } int Student::Num = 0; int main(){ Student students[3] = { Student(), Student("次郎", 168, 72), Student("三郎", 176, 85) }; show(students[0]); show(students[1]); show(students[2]); return 0; }