1. cout 究竟是什么?
cout是C++中的“标准输入输出流”对象。C++中推荐使用cout,C中推荐使用printf。
其实,cout是一个iostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕啦)输出东东。简单的说,就是 运算符重载,重载了“<<”运算符。请看HelloWorld!的等效版本:
#include <iostream>
using namespace std;
int main()
{
cout.operator<<("Hello,World!");
cout.operator<<(endl);
return 0;
}
编译运行,结果一致。
2. 为什么函数operator<<能够接受不同类型的数据,如整型、浮点型、字符串甚至指针呢?
运算符函数与一般函数基本无异,可以任意重载。标准库的设计者们早已经为我们定制了iostream::operator<<对于各种C++基本数据类型的重载版本。
3. 仿真验证cout
我们自己来实现一个cout的简化版(Lite)。为了区分,我们把我们设计的cout对象命名的myout,myout对象所属的类为MyOutstream。我们要做的就是为MyOutstream类重载一系列不同类型的operator<<运算符函数,简单起见,这里我们仅实现了对整型(int)与字符串型(char*)的重载。为了表示与iostream断绝关系,我们不再用头文件iostream,而使用古老的stdio中的printf函数进行输出,程序很简单,包括完整的main函数,均列如下:

{
public:
const MyOutstream& operator<<(int value)const;//对整型变量的重载
const MyOutstream& operator<<(char* str)const;//对字符串型的重载
};
const MyOutstream& MyOutstream::operator<<(int value)const
{
printf("%d",value);
return *this;//注意这个返回……
}
const MyOutstream& MyOutstream::operator<<(char*str)const
{
printf("%s",str);
return *this;//同样,这里也留意一下……
}
MyOutstream myout;//随时随地为我们服务的全局对象myout
int main()
{
int a=2003;
char* myStr="Hello,World!";
myout<<myStr<<"\n";
return 0;
}
4. 如何实现cout<<... <<... 连续输出字符的功能
考虑到cout能够连续输出字符,例如cout<<"Hello,World!"<<endl; 而不是cout<<"Hello,World!"; cout<<endl, 我们分析一下:按执行顺序,系统首先调用cout.operator<<("Hello,World!"),然后cout.operator<<会返回它本身,就是说在函数的最后一行会出现类似于return *this这样的语句,因此cout.operator<<("Hello,World!")的调用结果就返回了cout,接着它后面又紧跟着.operator<<(endl),这相当于cout.operator<<(endl)——于是又会进行下一个输出,如果往下还有很多<<算符,调用就会一直进行下去。
5. C++中的endl的功能与含义
运行函数,得到结果:myout<<"\n" ,最后出现的"\n"可以实现一个换行,不过我们在用C++时教程中推荐使用endl。
endl是一个操纵符(manipulator),它不但实现了换行操作,而且还对输出缓冲区进行刷新。原来在执行输出操作之后,数据并非立刻传到输出设备,而是先进入一个缓冲区,当适宜的时机(如设备空闲)后再由缓冲区传入,也可以通过操纵符flush,ends,或unitbuf进行强制刷新:cout<<"Hello,World!"<<"Flush the screen now!!!"<<flush; 这样当程序执行到operator<<(flush)之前,有可能前面的字符串数据还在缓冲区中而不是显示在屏幕上,但执行operator<<(flush)之后,程序会强制把缓冲区的数据全部搬运到输出设备并将其清空。而操纵符endl相当于<<"\n"<<flush; 不过可能在屏幕上显示是手动刷新与否区别看来都不大。但对于文件等输出对象就不大一样了:过于频繁的刷新意味着老是写盘,会影响速度。因此通常是写入一定的字节数后再刷新,如何操作?靠的就是这些操纵符。
本文转自 http://baike.baidu.com/view/1261354.htm
由本人进行了简化
1、static全局变量与普通全局变量有什么区别?
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式,这两者在存储方式上并无不同。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。两者区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的;而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,即使使用extern。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
2、static局部变量和普通局部变量有什么区别?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。函数中static局部变量的值在该函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函数调用结束时的值。
3、static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中被其它函数所调用的函数应该说明为(static)内部函数。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
4、静态数据成员和普通数据成员有什么区别?
每建立一个新对象时都会为各自的普通数据成员分配内存空间,但静态数据成员在内存中只占一份空间,为每个对象所共享,而不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间,它是在所有对象之外开辟空间的。
静态数据成员在程序编译时被分配空间,到程序结束时才释放空间,与对象的建立撤销无关。而普通数据成员,在声明类时它们是不占内存空间的,只在定义对象时才为对象的数据成员分配空间。
静态数据成员只能在类体外进行初始化,可以通过对象名或者类名引用。
5、静态成员函数和普通成员函数的区别?
本质区别是非静态成员函数有this指针,而静态成员函数没有this指针。
当调用一个对象的普通成员函数时,系统会把该对象的起始地址赋给普通成员函数的this指针,而静态成员函数不属于某一对象,也没有this指针,也就不能指向某一对象,就无法对一个对象中的非静态数据成员进行默认访问。
静态成员函数和静态数据成员一样,是类的一部分,而不是对象的一部分。静态成员函数可以直接引用本类的静态数据成员。
转自http://www.cnblogs.com/pure/archive/2010/10/19/1855569.html