プログラミングが初めての人でもわかるC++の講座です。ここではC++の機能である、構造体について解説します。
ここでは多少C++のプログラミングについて知っている人を対象に説明しています。
全くC++の知識がないという方は下記で基本について学んでから構造体コースの動画を御覧ください。
1.構造体とは?
構造体とは、変数をまとめて管理する機能です。
まずは構造体の基本的な機能について、プログラムを見ながら理解していきましょう。
動画で使用したプログラムは下記となります。
#include <iostream>
using namespace std;
struct A {
int num;
float array[10];
};
int main()
{
struct A a1;
struct A a2;
a1.num = 1;
for (int i = 0; i < 10; i++) {
a1.array[i] = i;
}
a2 = a1;
cout << a2.num << endl;
for (int i = 0; i < 10; i++) {
cout << a2.array[i] << endl;
}
}
上記のプログラムを実行したときの出力結果は下記となります。
1
0
1
2
3
4
5
6
7
8
9
構造体の配列もよく利用されます。下記に動画で使用したプログラムを示します。
#include <iostream>
using namespace std;
struct A {
int num;
};
int main()
{
struct A a1[3];
for (int i = 0; i < 3; i++) {
a1[i].num = i;
}
for (int i = 0; i < 3; i++) {
cout << a1[i].num << endl;
}
}
出力結果は下記のとおりです。
0
1
2
2.ポインタ
ポインタはアドレスを示す変数のことです。
構造体とポインタは切っても切れない関係です。ここではポインタを使用した構造体の取り扱いについて説明します。
動画で使用したプログラムは下記のとおりです。
#include <iostream>
using namespace std;
struct A {
int num;
};
int main()
{
struct A a;
a.num = 1;
struct A* a_ptr;
a_ptr = (A*)malloc(sizeof(A));
if (a_ptr != NULL) {
*a_ptr = a;
cout << a_ptr->num << endl;
}
}
出力結果は下記のとおりです。
1
3.関数とポインタ
第2回に続いて、ポインタについて掘り下げます。ポインタは直感的な理解が難しいですが、知っておくと構造体を扱う上でスマートなプログラムを書くことができます。
動画で使用したプログラムは下記のとおりです。
#include <iostream>
#include < stdio.h >
using namespace std;
struct A {
int num;
};
void func(struct A* a_ptr) {
cout << a_ptr->num << endl;
}
int main()
{
struct A *a_ptr;
a_ptr = (A*)malloc(sizeof(A));
if (a_ptr != NULL) {
a_ptr->num = 1;
}
func(a_ptr);
}
出力結果は下記のとおりです。
1
4.クラスの基本
ここからは話が変わって、クラスについて説明します。
クラスとは、構造体が進化したような機能であり、C++から搭載されています。
クラスを用いることで、変数に加えて関数もまとめて管理したり、さらなる追加機能を利用できます。よって、現在は構造体よりもクラスが使われます。
動画で使用したプログラムは下記のとおりです。
#include <iostream>
using namespace std;
class A {
private:
int num_priv;
public:
int num_pub;
void func_pub();
};
void A::func_pub() {
num_priv = 1;
cout << num_priv << endl;
}
int main() {
class A a;
a.num_pub = 100;
cout << a.num_pub << endl;
a.func_pub();
}
出力結果は下記のとおりです。
100
1
ファイル分割したプログラムを下記に示します。(cppファイル)
#include <iostream>
using namespace std;
#include "sub.h"
int main() {
class A a;
a.num_pub = 100;
a.func_pub();
}
(ヘッダー)
#pragma once
class A {
public:
int num_pub;
void func_pub();
};
(メソッド=クラス内関数の中身)
#include <iostream>
using namespace std;
#include "sub.h"
void A::func_pub() {
cout << num_pub << endl;
}
出力結果は下記のとおりです。
100
5.クラスとポインタ
ここではクラスとポインタの関係について説明します。構造体と同じく、クラスもポインタを上手く扱えるのが上達のコツです。
動画で利用したプログラムを下記に示します。
#include <iostream>
using namespace std;
class A {
public:
int num_pub;
void func_pub();
};
void A::func_pub() {
cout << "func" << endl;
}
int main() {
class A a[10];
for (int i = 0; i < 10; i++) {
a[i].num_pub = i;
cout << a[i].num_pub << endl;
a[i].func_pub();
}
}
出力結果を下記に示します。
0
func
1
func
2
func
3
func
4
func
5
func
6
func
7
func
8
func
9
func
2つ目のプログラムは下記のとおりです。
#include <iostream>
using namespace std;
class A {
public:
int num;
void func();
};
void A::func() {
cout << "func" << endl;
}
int main() {
class A a;
class A *a_ptr;
a.num = 100;
a_ptr = &a;
cout << a_ptr->num << endl;
a_ptr->func();
}
出力結果です。
100
func
6.オブジェクトのカウント
最後は静的メンバ関数を利用して、オブジェクトのカウントについて行ってみましょう。
少しレベルの高い内容なので、今までのクラスの使い方が理解できてから取り組んでみましょう。
動画で使用したプログラムを下記に示します。(静的メンバ関数)
#include <iostream>
using namespace std;
class A {
public:
static int static_num;
};
int A::static_num = 10;
int main() {
cout << A::static_num << endl;
class A a;
cout << a.static_num << endl;
}
出力結果は下記のとおりです。
10
10
下記がオブジェクトのカウントに関するプログラムです。
#include <iostream>
using namespace std;
class A {
public:
static int obj_num;
A();
};
int A::obj_num = 0;
A::A(){
obj_num++;
}
int main() {
cout << A::obj_num << endl;
class A a1;
cout << A::obj_num << endl;
class A a2;
class A a3;
cout << A::obj_num << endl;
}
出力結果です。
0
1
3
おわりに
今回は、動画でC++プログラミングについて説明する「丁寧に学ぶC++構造体」「丁寧に学ぶC++クラス」で利用したプログラムの中身についてまとめました。
他にもC++に関する動画をまとめているので、そちらも御覧ください。