首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关c++中命名空间有关问题

2013-11-11 
有关c++中命名空间问题最近在学习c++,由于以前有c基础,学习c++感觉还是有点吃力,因为很多东西都不太一样问

有关c++中命名空间问题
最近在学习c++,由于以前有c基础,学习c++感觉还是有点吃力,因为很多东西都不太一样
问题:
我想知道在开始写程序的时候要先这样


#include <iostream>
using name space std

其中在程序中输出一句话要用到cout
网上查了些资料,说cout的声明在iostream中,定义在iostream中的std命名空间中
但是我看了一下iostream中的std中只是声明count而非定义啊
extern _CRTIMP ostream cout;//这里好像是声明吧。。。

后来我查了一下,定义是在这里
Microsoft Visual Studio 9.0\VC\crt\src\cout.cpp
悲催的我又看了一下文件的内容
// cout -- initialize standard output stream
#include <fstream>
#include <iostream>

#pragma warning(disable: 4074)
#pragma init_seg(compiler)
static std::_Init_locks  initlocks;

_STD_BEGIN
// OBJECT DECLARATIONS

__PURE_APPDOMAIN_GLOBAL static filebuf fout(_cpp_stdout);
#if defined(_M_CEE_PURE)
__PURE_APPDOMAIN_GLOBAL extern ostream cout(&fout);
#else
__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout(&fout);
#endif
// INITIALIZATION CODE
struct _Init_cout
{// ensures that cout is initialized
__CLR_OR_THIS_CALL _Init_cout()
{// initialize cout
_Ptr_cout = &cout;
if (_Ptr_cin != 0)
_Ptr_cin->tie(_Ptr_cout);
if (_Ptr_cerr != 0)
_Ptr_cerr->tie(_Ptr_cout);
if (_Ptr_clog != 0)
_Ptr_clog->tie(_Ptr_cout);
}
};
__PURE_APPDOMAIN_GLOBAL static _Init_cout init_cout;

_STD_END

/*
 * Copyright (c) 1992-2007 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V5.03:0009 */

说其中

#if defined(_M_CEE_PURE)
__PURE_APPDOMAIN_GLOBAL extern ostream cout(&fout);
#else
__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout(&fout);
#endif

是定义,我的问题来了,这不还是声明吗??? 难道c跟c++的定义跟声明含义是不一样的吗?
在c中声明就是声明一个函数,定义是对这个函数的具体实现
c++中的声明跟定义是什么?,还有我想问的是cout到底在哪里定义的(不是声明...)
大家帮忙解答啊~ c++基础 c++命名空间std cout对象
[解决办法]
引用:
Quote: 引用:

ostream cout(&fout);这里已经有个直接初始化了,所以是定义。在这个概念上,C++与C是一样的。

直接初始化啥意思?前面不是有个extern 吗 extern 后面接的不是函数的声明吗? 初学c++,不太明白。。。能详细一点吗? 谢谢了~


直接初始化是与复制初始化相对而言的,函数实参传递、函数返回值、聚集成员初始化、异常抛出及处理都属于复制初始化。
[解决办法]
引用:
Quote: 引用:

ostream cout(&fout);这里已经有个直接初始化了,所以是定义。在这个概念上,C++与C是一样的。

直接初始化啥意思?前面不是有个extern 吗 extern 后面接的不是函数的声明吗? 初学c++,不太明白。。。能详细一点吗? 谢谢了~
对,直接初始化了。就是说,在声明的时候同时进行了定义。


extern是导出的意思,虽然一般是作为声明用的,但如果在声明的时候同时赋值,或者调用构造函数等等,都是一种初始化,会生成对象实例,而不是简单的声明。

比如下面这个例子是没问题的,extern i只是一个单纯的声明

int i=0;
extern i;
int main(){}
但如果这里改成这样就不行了,因为此时i会被初始化,这样就等于是重定义了一个i,相当于extern没起作用

int i=0;
extern i=0;
int main(){}

热点排行