您的位置:首页 > 其它

为什么加上这个就能用?using namespace是什么意思?

2008-01-18 16:10 766 查看
来源:http://www.ucnu.cn/software/p676/A67683089.shtml

为什么加上这个就能用?using namespace是什么意思?

Posted on 10月 13rd, 2007

然后在头文件中写上
#include <iostream>
头文件尾上加using namespace std;

网友回答:

网友:rgbcn
命名空间的概念

很多初学c++的人,对于c++中的一些基本的但又不常用的概念感到模糊,命名空间(namespace)就是这样一个概念。

c++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量string user_name, 有可能在你调用的某个库文件或另外的程序代码中也定义了相同名字的变量,这就会出现冲突。命名空间就是为解决c++中的变量、函数的命名冲突而服务的。解决的办法就是将你的strtemp变量定义在一个不同名字的命名空间中。就好像张家有电视机,李家也有同样型号的电视机,但我们能区分清楚,就是因为他们分属不同的家庭。

例如:

#include <iostream>
#include <string>
using namespace std;

//using namespace编译指示,使在c++标准类库中定义的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出错。

//两个在不同命名空间中定义的名字相同的变量

namespace myown1{

string user_name = "myown1";
}
namespace myown2{

string user_name = "myown2";
}

int main()
{
cout<< "/n"
<< "hello, "
<< myown1::user_name //用命名空间限制符myown1访问变量user_name
<< "... and goodbye!/n";

cout<< "/n"
<< "hello, "
<< myown2::user_name //用命名空间限制符myown2访问变量user_name
<< "... and goodbye!/n";

return 0;
}

当然,我们也可以使用程序开头的预编译指示来使用命名空间中的名字。使用预编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。以上主程序可修改为:
int main()
{
using namespace myown1;
cout<< "/n"
<< "hello, "
<< user_name
<< "... and goodbye!/n";

// using namespace myown2;
cout<< "/n"
<< "hello, "
<< myown2::user_name //用命名空间限制符myown2访问变量user_name
<< "... and goodbye!/n";

return 0;
}

但第二个变量必需用命名空间限制符来访问,因为此时myown1空间中的变量已经可见,如果不加限制,编译器就会无法识别是那一个命名空间中的变量。这一点一定要注意。 以上只是初学者不清楚的一个概念,在以后的文章中还将继续讨论其它的一些概念。

.

其它问题:
1、C中有没有函数可以统计一个目录下文件子目录个数

或者除了directory(3C)还有没有其它对目录操作的库?

2、关于动态生成控件的问题1

听大侠的话,问题一个一个问,呵呵

问题1:动态生成几个控件,如何判断哪个控件被选中进行拖放/缩放?(动态生成的控件的唯一标识是什么?)
比如,在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应,请教是什么原因?
注:动态产生的控件是一个链表结构,每动态生成一个控件就加入链表中
相关代码如下:
TDataFieldList=^DFL;
DFL=Record
DataField:TRichEdit;
Name:string;
XPos:integer;
YPos:integer;
Next:TDataFieldList;
end;

var DataFieldList:TDataFieldList;
AEdt:TRichEdit;

procedure TFormDataField.EdtOnDragOver(Sender,Source:TObject;X,Y:Integer;
State:TDragState;var Accept:Boolean);
var p:TDataFieldList;
begin
p:=DataFieldList;
while Source<>p.DataField do//判断是哪个控件被拖放
p:=p.Next;
// if Source=AEdt then
Accept:=True;
FormNew.isDragFormNew:=True;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐