C++

【OpenFOAMの理解のためのC++メモ(1)】出力ストリーム、名前空間、関数、配列

これからOpenFOAMのC++を学ぶために基本的な内容をメモとして残しておきます。

OpenFOAMはC++プログラミング言語により実装されたCFDに必要な機能がまとめられたオブジェクト指向の考え方で設計されているツールです。

本記事の内容

C++の基本的な内容を理解する。
※クラスの定義は出てきません(次回の内容とします)。

C++の全てを学ぼうとすると膨大過ぎてとても扱いきれないので、必要最低限知っておくとよい内容を簡単にまとめていきます。

出力ストリーム

ファイル名を「main000.cpp」として以下のように書きます。

mai000.cpp

これをg++でコンパイルすると「a.out」という実行ファイルが作られるので、コマンドで

と打って計算実行します。

【結果】

「main000.cpp」の1行目に出てくる、#includeiostreamというヘッダファイルを読み込むための宣言です。

複数人でプログラムの開発をする場合に、変数名がかぶらないように名前空間で管理することができます。

とすることで名前空間stdのcout(コンソール画面に出力するための出力ストリーム)を呼び出すことができます。

出力ストリーム(標準名前空間の利用)

と毎回書くのがわずらわしい場合には、「標準名前空間を利用する」という宣言「using namespace std;」と書くことで省略した書き方が可能です。

mai001.cpp

using namespace std;の部分ですが、using namespaceは、指定された名前の名前空間を使うことを意味しています。

別の名前空間

複数人でプログラムを開発している場合に、意図せずに同じ変数名を使ってしまう場合があります。この場合に、先ほど出てきたように別の名前空間内で変数を設定しておくことで、変数名が干渉せずに使用することができます。

名前空間は、

のように書きます。

main002.cpp

名前空間内の変数を呼び出す際には「 Foam1::a」のように書きます。

【結果】

今回、別の名前空間「Foam1」「Foam2」内に同じ変数名「a」「b」を定義しましたが、出力結果を見ると別の名前空間内での変数は干渉することなく出力できています。

名前空間内は変数以外にも、関数やクラスも定義できるのですが、追々練習でやっていきます。

スコープ

変数には賞味期限のようなものがあって、有効になる範囲というのがあります。
main002.cppに以下を追加しました。

main003.cpp

【結果】

{}内の「int a = 100;」は{}でしか有効であり、{}の外に出るとmain()関数の一番初めの「int a = 5;」が有効になっているのが確認できます。

関数

まとまった処理に関しては関数を作っておくと便利です。

値渡し

main004.cpp

【結果】

「counter_func(a_cout);」で変数「a_cout」を関数に引き渡して関数を呼び出しています。
ここで注意する点は、

counter_func()関数内の「counter」と、main()関数内の「a_count 」は別のメモリ領域に値を格納しているため、counter_func()関数内で「++counter」により値が1増えるのですが、たちまちcounter_func()関数の外に出るとmain()関数内の「a_count 」は相変わらず1だということです。
これを値渡しと言います。

参照渡し

引数に&をつけることで同じメモリ領域を参照して引数として渡すことができます。

main005.cpp

【結果】

参照渡しの関数では「counter 」と「a_cout」が同じidになっているのが確認できます。
なので、「a_cout」がcounter_func1()関数に渡されたときには「++counter」によって変わった値 は「a_cout」と同じidに格納されるので、counter_func1()関数の外に出てると「a_cout」の値は1になっています。

関数処理を行いたい場合に、無駄駄にメモリを消費しないので良いのですが、思いもよらないところで値が変わっている可能性があるので注意が必要ですね。

関数に配列を渡す

配列を関数に渡す場合は配列そのものを関数に渡してしまうと、無駄にメモリ領域を食うことになるので配列の先頭のアドレスをポインタとして渡すことでメモリ消費を抑えます

【結果】

ここでは、main()関数内ではじめに配列を定義しています。

要素の数は、「 sizeof(array)  => 20」で配列全体の大きさを整数型の要素の大きさ「sizeof(int) => 4」で割ることで取得できます。

配列を関数に渡すときは、配列の先頭のアドレスをポインタとして渡しています。

途中で、

のようにして配列の値を出力指定していますが、これは配列の初めの要素のポインタaに対してa[i]の指す値を取得しています。

参考記事

OpenFOAMの簡単なコードを書いてカスタマイズ練習ができる内容を挙げておきます。

C++の基礎を学びたいときにとても参考になる動画を挙げておきます。

OpenFOAMに特化した内容を学びたい場合は以下の記事が参考になります。

参考書

持っている参考書をC++の書籍を載せておきます。

1週間でC++の基礎が学べる本

1週間でC++の基礎が学べる本

亀田 健司
1,430円(12/06 18:56時点)
発売日: 2021/03/12
Amazonの情報を掲載しています

↑こちらは初めにC++を学ぶにはちょうど良い内容かと思います。
実はこちらに書籍の内容がまとめられています。

独習C++ 新版

独習C++ 新版

高橋 航平
3,346円(12/06 18:56時点)
発売日: 2019/11/11
Amazonの情報を掲載しています

↑基礎が身に付いたら体系的に学ぶために持っていても良いと思う書籍です。

江添亮のC++入門

江添亮のC++入門

江添 亮
5,500円(12/06 10:32時点)
Amazonの情報を掲載しています

「現行の規格に準拠したC++プログラムの書き方を徹底的に解説していく」と謳っているように内容も中級者以上を対象にした本格的なC++の書籍です。
実はこちらに本の内容がそのままアップされています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です