有关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对象
[解决办法]
直接初始化是与复制初始化相对而言的,函数实参传递、函数返回值、聚集成员初始化、异常抛出及处理都属于复制初始化。
[解决办法]
ostream cout(&fout);这里已经有个直接初始化了,所以是定义。在这个概念上,C++与C是一样的。
直接初始化啥意思?前面不是有个extern 吗 extern 后面接的不是函数的声明吗? 初学c++,不太明白。。。能详细一点吗? 谢谢了~
extern是导出的意思,虽然一般是作为声明用的,但如果在声明的时候同时赋值,或者调用构造函数等等,都是一种初始化,会生成对象实例,而不是简单的声明。
比如下面这个例子是没问题的,extern i只是一个单纯的声明
但如果这里改成这样就不行了,因为此时i会被初始化,这样就等于是重定义了一个i,相当于extern没起作用
int i=0;
extern i;
int main(){}
int i=0;
extern i=0;
int main(){}