1. C++为什么不建议在.h文件中使用using namespace std;
namespace 的引入是为了解决名字冲突的问题,而 using namespace... 的引入是为了方便程序员,使其不用每次都输入长长的名字。这些都跟性能无关。
通常不建议在头文件中使用 using namespace xxx 语句,不仅是对 std。如果头文件 a.h 使用了该语句,所有直接或间接包含 a.h 的文件都隐式使用了该语句,这会很容易导致名字冲突。
2.static作用
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
使一个对象可以在堆上创建,但是不能在栈上创建
Class A
{
Public:
Static A* newInstance()
{
Return new A;
}
Static void deleteInstance(A* a)
{
If (a != NULL)
{
Delete a;
}
}
Private:
A(){}
};
Int main()
{
A a;//在栈上创建对象,会出现编译错误
A* a = A::newInstance();//成功在堆上创建对象
A::deleteInstance(a);//成功释放内存
}
使一个对象可以在栈上创建,但是不能在堆上创建
方法是通过重载new和delete操作符并且私有化,这样就可以禁止对象在堆上分配了(因为一个对象在堆上的创建只能通过new来实现)
Class A
{
Private:
Void* operator new (size_t size)
{
Return malloc(size);
}
Void operator delete(void* ptr)
{
If (ptr)
Free(ptr);
}
Public:
A(){}
}
Int main()
{
A a;//在栈上创建,正确
A* a = new A;//在堆上创建,编译错误
}