笔试面试题记录

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语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。 

不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。



3.两个关于类的创建的问题

使一个对象可以在堆上创建,但是不能在栈上创建

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;//在堆上创建,编译错误
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值