2017年11月10日
《その113》 inlineメンバ関数 & 中級編 p.11演習1-1
今回から「新版 明解C++ 中級編」 になります。
inlineメンバ関数
inlineメンバ関数について、次の ※ヘッダ_1 〜 ※ヘッダ_4 の例を見ながら再確認しておきたいと思います。
※ヘッダ_1
クラス C のメンバ関数 func1, dunc2 の定義は、クラス定義の中で行われています。
この場合は自動的にインライン関数になります。
インライン関数は内部結合を持ちますから、ヘッダが複数のファイルでインクルードされても二重定義エラーは起こりません。
// C.h ※ヘッダ_1 --------
class C {
・・・・・・
public:
・・・・・・
bool func1() const { ・・・ }
void func2() const { ・・・ }
};
// ------------------------
※ヘッダ_2
クラス C のメンバ関数 func1, dunc2 の定義は、クラス定義の外で行われています。
この場合、これらのメンバ関数は外部結合を持つことになります。
ヘッダが複数のファイルでインクルードされた結果、二重定義エラーが起こる可能性があります。
// C.h ※ヘッダ_2 --------
class C {
・・・・・・
public:
・・・・・・
bool func1() const;
void func2() const;
};
bool C::func1() const { ・・・ }
void C::func2() const { ・・・ }
// ------------------------
※ヘッダ_3
クラス C のメンバ関数 func1, dunc2 の定義はクラス定義の外で行われていますが、inline 関数になっているので、二重定義エラーは起こりません。
// C.h ※ヘッダ_3 --------
class C {
・・・・・・
public:
・・・・・・
bool func1() const;
void func2() const;
};
inline bool C::func1() const { ・・・ }
inline void C::func2() const { ・・・ }
// ------------------------
※ヘッダ_4
クラス C のメンバ関数 func1, dunc2 の定義は別ファイルで行われていますから、複数のファイルがこのヘッダをインクルードしても二重定義エラーは起こりません。
// C.h ※ヘッダ_4 --------
class C {
・・・・・・
public:
・・・・・・
bool func1() const;
void func2() const;
};
// ------------------------
// C.cpp 別ファイル-------
bool C::func1() const { ・・・ }
void C::func2() const { ・・・ }
// ------------------------
インライン関数にすることでプログラムの実行速度の向上が見込めるかもしれませんが、当面は、プログラム実行速度を気にしなければならないような場面に出くわすことはなさそうです。
初心者ですから。 ( ̄▽ ̄;)
新版明解C++中級編 p.11 演習1-1
クラス Human のコンストラクタを、コンストラクタ初期化子を用いて初期化する形で記述し、初期化が期待通りに行われることを確認せよ。
// Human.h
#ifndef ___Class_Human
#define ___Class_Human
#include <string>
class Human {
private:
std::string full_name;
int height;
int weight;
public:
Human(const std::string&, int, int);
std::string name() const;
int get_height() const;
int get_weight() const;
void grow_fat(int);
void slim_off(int);
};
#endif
// Human.cpp
#include <string>
#include <iostream>
#include "Human.h"
using namespace std;
Human::Human(const string& name, int h, int w)
: full_name(name), height(h), weight(w) { }
string Human::name() const {
return full_name;
}
int Human::get_height() const {
return height;
}
int Human::get_weight() const {
return weight;
}
void Human::grow_fat(int dw) {
weight += dw;
}
void Human::slim_off(int dw) {
weight -= dw;
}
// HumanTest.cpp
#include <iostream>
#include <string>
#include "Human.h"
using namespace std;
int main() {
Human nakano("中野太郎", 173, 65);
const Human morita("森田孝司", 168, 71);
nakano.slim_off(3);
cout << "nakano = " << nakano.name() << " "
<< nakano.get_height() << "cm "
<< nakano.get_weight() << "kg\n";
cout << "morita = " << morita.name() << " "
<< morita.get_height() << "cm "
<< morita.get_weight() << "kg\n";
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6952440
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック