面试题
1.写出只允许定义在堆上的类
class onlyheap
{
public:
static onlyheap* getheap()
{
return new onlyheap;
}
private:
onlyheap()
{
cout<<"正在调用构造函数";
};
onlyheap(onlyheap &heap);
};
1.只允许在堆上定义对象,则禁止定义在栈上定义对象,所以将构造函数和拷贝构造函数设置为private防止外部调用
2.设置一个接口函数用new在堆上构造对象,逻辑上需要一个类似全局函数不需要对象就能使用,所以将接口函数定义为static。
2.写出只允许定义在栈上的类
方法1
class Stack_1
{
public:
static Stack_1 getStack_1()
{
return Stack_1();
}
private:
Stack_1()
{
cout<<"正在调用onlyStack_1的构造函数";
};
};
思路和上面的类相同,类提供接口,但是缺点是接口返回的是值传递,所以理论上在编译器未优化的情况下实现Stack_1 q=Stack_1::getStack_1();
需要创建三个Stack_1对象,效率低
方法2
class Stack_2
{
private:
void* operator new(size_t m);
};
将operator new 设置为私有成员,这样就防止了new的使用,
缺点是,无法防止对象定义在静态区中,成为全局变量。
方法3
class Stack_3
{
public:
void* operator new(size_t m)=delete;//c11
};
delete是c11标准,作用是将函数删除掉,能禁止在堆上定义对象,但是缺点和上面的方法一样,无法禁止在静态区中定义全局对象。