名前空間の復習

試験問題の名前空間のやつ

これの出来がすこぶる悪かったのでちょっと解説します。
解説聞いたらもう一度読んで解いてみてね

"main.cpp"
//ソースコード
#include <iostream>
 
//コメントA namespace CosntNum
namespace ConstNum
{
	const int WIDTH = 10;
	const int HEIGHT = 20;
}
 
//コメントB namespace ????
namespace 
{
	int totalNum;
}
 
int main() {
  std::cout << "Hello World!\n";
}
 
ソースコードを呼んで、関連する以下の選択肢から正しいものをすべて選びなさい。
1つまたはそれ以上選択してください:

選択肢

A. コメントB以下のnamespace内で宣言されたnamespaceは、名前がついていないため無名名前空間と呼ばれる
B. コメントB以下のnamespaceは、namespaceの名前が宣言されていないためエラーを引き起こす
C. コメントA以下のnamespaceも、コメントB以下のnamespaceも、同じファイル内のmain関数からは、特に何の宣言もなしにnamespace内のメンバにアクセス可能である
D. コメントA以下のnamespaceは、ConstNumという名前がついているため、namespace内で宣言された関数も変数もすべて定数化される
E. コメントB以下のnamespace内で宣言された変数は、名前がないため、どのファイルからも自由にアクセス可能になる
F. コメントA以下のnamespace内で宣言された変数は、using namespace ConstNum;を宣言することにより、通常の変数と同様に変数の名前のみでアクセス可能になる
G. コメントA以下のnamespace内で宣言された変数は、ConstNum::を変数名の前につけて参照することにより、通常の変数と同様に参照可能である
H. コメントB以下のnamespace内で宣言された変数は、宣言されたファイル以外からは隠蔽され外部からのアクセスができなくなる
I. namespace内に関数や変数を宣言することにより、同名の関数や変数が複数あっても、それぞれ別の関数や変数として区別をつけて使うことが可能になる
J. コメントA以下のnamespaceでは、constと書かれているがnamespaceの効果により定数にはならない
K. コメントA以下のnamespaceは、同じファイル内でnamespace内の変数を参照するときに、using namespace std;を宣言しなければ、参照することができない

名前空間の使い方その1

#include <iostream>
#include <string>
 
//using namespace std; 
using std::string;
using std::cout;
using std::endl;
 
namespace GE1A {
	string suzuki = "tarou";
}
namespace GE2A {
	string suzuki = "jirou";
}
 
namespace { //無名名前空間
	string suzuki = "saburou";
}
 
 
int main()
{
 
	cout << GE1A::suzuki << endl;
	cout << GE2A::suzuki << endl;
	cout << suzuki << endl;
	return 0;
}

名前空間の使い方その2

メンバーがとびとびに宣言されていても問題ないよ。

#include <iostream>
#include <string>
 
//using namespace std; 
using std::string;
using std::cout;
using std::endl;
 
class Gundam
{
public:
	Gundam(string _color)
		:color_(_color) {}
	string color_;
};
 
 
namespace AEUG {
	Gundam mark2("白");
}
namespace TITANS {
	Gundam mark2("青");
}
 
 
namespace AEUG
{
	string basecamp = "AEUG";
}
namespace TITANS {
	string basecamp = "TITANS";
}
 
namespace
{
	string basecamp = "AXIS";
}
 
 
int main()
{
	cout << AEUG::basecamp << AEUG::mark2.color_ << endl;
	cout << TITANS::basecamp << TITANS::mark2.color_ << endl;
	cout << basecamp << endl;
 
	return 0;
}