56. switch⽂の例(2)
switch (score) {
case 1:
case 2:
cout << "もっと頑張りましょう";
break;
case 3:
case 4:
case 5:
cout << "合格です";
break;
default:
cout << "想定されていない点数です";
}
実際に試してみよう
57. ワン・モア・ステップ : 3項演算⼦
(構⽂) 条件式 ? 値1 : 値2
条件式が「真」の場合に、式の値が「値1」になる。
「偽」の場合には「値2」になる
int c;
if (a > b) {
c = a;
} else {
c = b;
}
int c = (a > b) ? a : b;
59. 論理演算⼦の例
ageが13以上 かつ ageが65未満
age >= 13 && age < 65
ageが13以上 かつ age が65未満 かつ age が20でない
age >= 13 && age < 65 && age !=20
ageが13未満 または age が65以上
age < 13 || age >= 65
60. 演算⼦の優先度
算術演算⼦が関係演算⼦より優先される
a + 10 > b * 5 (a + 10) > (b * 5)
関係演算⼦が論理演算⼦より優先される
a > 10 && b < 3 (a > 10) && (b < 3)
カッコの付け⽅で論理演算の結果が異なる
x && ( y || z ) (x && y ) || z
実際に試してみよう
68. while⽂の例
int i = 0;
while (i < 5) {
cout << "こんにちは" << endl;
i++; // この命令文が無いと「無限ループ」
}
int i = 5;
while (i > 0) {
cout << "こんにちは" << endl;
i--; // この命令文が無いと「無限ループ」
}
実際に試してみよう
※ 無限ループにならないように注意が必要
( [Ctrl]+c キーで強制終了できる)
69. do 〜 while⽂
do 〜 while⽂の構⽂
do {
命令文
} while (条件式);
1. 「命令⽂」を実⾏する
2. 「条件式」が 真なら1.に戻る。
偽ならdo〜whileループを終了する
※ for⽂、while⽂と同じ繰り返し命令を書ける
必ず1回は実⾏される
70. do 〜 while⽂の例
int i = 0;
do {
cout << "こんにちは" << endl;
i++; // この命令文が無いと「無限ループ」
} while (i < 5);
int i = 5;
do {
cout << i << endl;
i--; // この命令文が無いと「無限ループ」
} while (i > 0);
実際に試してみよう
※ 無限ループにならないように注意が必要
71. ループの処理を中断する break
break; でループ処理を中断できる
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
cout << "変数sumに" << i << "を加えました。";
cout "sumは" << sum << endl;
if (sum > 20) {
cout << "合計が20を超えました。";
break;
}
}
73. for (int a = 1; a <= 3; a++) {
cout << "a = " << a << endl;//★
for (int b = 1; b <= 3; b++) {
cout << " b = " << b << endl;//☆
}
}
ループ処理のネスト
ループ処理の中にループ処理を⼊れられる
★の命令⽂は3回実⾏される
☆の命令⽂は9回実⾏される
実際に試してみよう
143. 基底クラスのメンバ関数を呼び出す
143
class StudentCard {
public:
int id = 0;
string name = "未定";
void printInfo() {
cout << "学籍番号:" << id << endl;
cout << "氏名:" << name << endl;
}
};
class IStudentCard : public StudentCard {
public:
string nationality = "未定";
void printInfo() {
cout << "国籍:" << nationality << endl;
StudentCard::printInfo();
}
};
基底クラスが持つメンバ関数を呼び出す
基底クラス名の後ろにコロン(:)を2つ並べて
から関数名を書くことで派⽣クラスから基底
クラスのメンバ関数を呼び出せる
144. クラスの継承と参照
144
class Person { };
class Student : public Person { };
class Teacher : public Person { };
class Car { };
上図の継承関係を持つ4つのクラス
Person型オブジェクトの参照を受け取る関数
関数に渡せるオブジェクト
×
※ 派⽣クラスのオブジェクトも渡すことができる
145. オーバーライドとポリモーフィズム
• virtual キーワードがついたメンバ関数
を仮想関数と呼ぶ
• 仮想関数を派⽣クラスが再定義すること
をオーバーライドと呼ぶ
• 基底クラスの型の参照を通じてメンバ関
数を呼び出したとき、派⽣クラスのメン
バ関数が実⾏される。この仕組みをポリ
モーフィズムと呼ぶ
145
class Person {
public:
virtual void work() { cout << "人:仕事する" << endl; }
};
class Student : public Person {
public:
void work() override { cout << "学生:勉強する" << endl;}
};
class Teacher : public Person {
public:
void work() override { cout << "教員:授業する" << endl;}
};
void execute_work(Person& person) { person.work(); }
int main() {
Person person;
Student student;
Teacher teacher;
execute_work(person);
execute_work(student);
execute_work(teacher);
}
人:仕事する
学生:勉強する
教員:授業する
実行結果
実際に試してみよう
148. テンプレートとは
テンプレートを使うと、1つのプログラムコードで複数の型に対応
する関数やクラスを定義できる。
148
int get_max(int a, int b) {
return a > b ? a : b;
}
例:2つの引数のうち⼤きい⽅の値を返す get_max関数を作りたい
double get_max(double a, double b) {
return a > b ? a : b;
}
int型に対応した関数
double型に対応した関数
型の数だけ関数を定義する必要があるのは不便 → テンプレートを使⽤する
template <typename T>
T get_max(T a, T b) {
return a > b ? a : b;
}
※ 型名を T (プレースホルダ)で表現する
※ 関数を呼び出すときは
get_max<int>(3, 10)
のようにして型を指定する
149. 関数テンプレートの使⽤例
• 関数テンプレートを使⽤すると、異
なる型に対応する関数を⼀度書くだ
けで済む
• 関数を呼び出すときに、型を指定す
る <int> や <double> の箇所を
省略できる(これは、コンパイラが
引数を⾒て推測できるため)
149
#include <iostream>
using namespace std;
template <typename T>
T get_max(T a, T b) {
return a > b ? a : b;
}
int main() {
int i = get_max<int>(10, 4);
double d = get_max<double>(1.2, 5.2);
cout << i << ", " << d;
}
10, 5.2
実行結果
実際に試してみよう