読者です 読者をやめる 読者になる 読者になる

Awesome Hacks!

プログラミング初心者なので地道に勉強していきます。分からない人の立場から整理していきます。

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;
}