質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3675閲覧

クラスでなくネームスペースを使うメリットを教えて下さい

gochuumonha

総合スコア74

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/11 04:18

編集2017/08/11 04:24

C++の本を読んでいて思ったのですが、関数を記述するときにクラスでなくネームスペースを使うのにメリットはあるのでしょうか?

ネームスペース内にクラスを記述するのはわかります。

ただ、ネームスペース内にそのまま関数を記述する必要性がわかりません。
例えば、標準関数のstd::coutなどはstdというクラス内に関数coutを定義すれば、同様にstd::coutとして実行できると思います。

その上でネームスペースにしていることに何のメリットがあるのか教えて下さい。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

プログラムは時間が経過すると忘れてきます。
他人に使ってもらったりする場合、間違えて使ってしまう場合もあり得ます。
それゆえ、なるだけ余計な機能やややこしく感じることは避けることが無難です。
間違って使ったらバグらずに静的エラー(エディターのコード内で波線が出る)が出るようにする必要があります。

酒飲んでヘロヘロ状態でコードを組んだら、
バグが良く起きる・・・NG
静的エラーがよく出る・・・OK

上記を基本に考えていきます。

●クラスで静的関数を定義する場合

インスタンス生成やその他、特別なものがあるかもしれない・・・などを考えてしまいます。
人間、疲れてくると単純なミスも犯しやすいです。
インスタンス生成を抑止するコンストラクタを記述したり、コードが煩雑になります。
機能拡張やクラス内メソッドでの相互関連性などがある場合いいかもしれません。

●名前空間でグローバル関数(グーグル流の言葉ならグローバルメソッド)

より独立しているよっていう意味付けや意識づけがされます。
シンプルで分かりやすいです。
インスタンス生成するかどうかなんて悩まなくていいです。クラスでないのでインスタンス生成ミスはあり得ません。
関数が少ないなら、名前空間も不要でしょう。
しかし、関数が多い場合、カテゴリによる選択に手間がかかります。
カテゴリによる名前空間で分ければ、迷わなくて済み、選択効率も上がるわけです。
複数人のプログラマーの作業ならば、作業者の名前空間、処理のカテゴリの名前空間、という感じでネストしていきますね。

●結論
いずれにしても長いプログラムで、どういう働きのモジュールが必要かによって、
どちらがいいかは変わってきます。

間違ったら、バグでなく、静的エラーになる、この仕組みを徹底することが重要と考えています。

グーグルのコーディング規約ではグローバルメソッドは使うな、とか書かれていたような気がしますが、
人それぞれかとは思いますね。
※間違っていたらご指摘お願いします。

投稿2017/08/15 04:00

loppta

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gochuumonha

2017/08/15 04:06

ありがとうございます‼ とても分かりやすい説明でした。 どうしてネームスペースを使うのか府に落ちました。
loppta

2017/08/15 04:17

ゲームプログラムとか、長いプログラムを組むと バグらないように組む重要性が実感して分かるようになります。難しいことをせずシンプルで分かりやすいコードの重要性も感じてきます。 書籍などでは、この辺の利便性については書かれていないですよね。
guest

0

ベストアンサー

こんにちは。

質問の意味が今ひとつ捉えにくいのですが、グローバル関数の必要性を聞いているものと理解しました。(違っていたらごめんなさい。)

例えば、<algorithm>には多数のグローバル関数が定義されています。
これらを、例えば、algorithmクラスのstaticメンバ関数と定義しても大差はないと思います。

ただ、グローバル関数や変数を許さないC#を使った時に感じることがあります。例えば定数クラスを定義する時、Constantsなんてクラスを定義して、そこに定数群を入れます。C/C++に慣れた身からするとConstantsなんて無駄な印象を強く感じます。
また、意味は明らかに「汎用」なグローバルな定数なのに、特定のクラスに属させないといけないこと違和感を感じるのだと思います。

C++の世界には「フリー関数」と言う言葉が有ります。グローバル関数のことですが、クラスに縛られないフリーな関数という意味ですね。良い言葉だと思います。


【ところで】
std::coutは、std::ostreamクラス型変数への参照ですよ。関数ではありません。

投稿2017/08/11 05:48

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gochuumonha

2017/08/11 06:48

回答ありがとうございます。僕の理解不足で質問が分かりにくくてすいません???? 理解できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問