首页 > 试题广场 >

在C++中,为了让某个类只能通过new来创建(即如果直接创建

[单选题]
在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
  • 将构造函数设为私有
  • 将析构函数设为私有
  • 将构造函数和析构函数均设为私有
  • 没有办法能做到
推荐
B
http://blog.csdn.net/hxz_qlh/article/details/13135433
[ 译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。 因此, 将析构函数设为私有,类对象就无法建立在栈(静态)上了,只能在堆上(动态new)分配类对象 ]
编辑于 2016-01-13 12:47:45 回复(11)
namespace t15 {
	class Heap {
	public:
		// 用户可以调用new创建对象
		Heap()
		{
			p = malloc(100);
		}

		void destroy() 
		{ 
			delete this;
		}

	private:
		// 用户无法调用delete删除对象
		~Heap()
		{
			free(p);
		}
	private:
		void *p;
	};
};
void test15()
{
	t15::Heap *p = new t15::Heap();
	p->destroy();
}

编译器在栈上创建对象时,如果类的析构函数是私有的,则无法回收栈上的内存。因此无法在栈上创建。

通过new创建对象,但是无法通过delete删除对象,需要提供额外的destroy()函数

发表于 2016-01-12 21:45:36 回复(0)
构造函数可以私有,但是此时直接定义类对象和new来定义对象都不再允许,因为new只管分配,不管构造,编译器不会允许未构造的动态内存分配。
发表于 2016-02-27 19:51:31 回复(1)
在c++中,类的建立分为两种,一种是静态建立,如A a,在栈空间中分配内存;一种是动态建立,即使用new,在堆空间中分配内存;所以本题就是不在栈空间中分配,通过将析构函数私有化可以做到。

发表于 2017-10-09 20:43:28 回复(0)
因为栈上分配内存时,用完后会自动释放,所以会先检查析构函数是否可以调用,若不能调用则不能在栈上分配空间。
故只要将析构函数设为私有,即可限制内存的分配。

发表于 2016-05-20 20:43:50 回复(2)
加点印象,c++ primer 450页中间
发表于 2017-05-09 10:55:17 回复(0)
在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
  • 将构造函数设为私有
  • 将析构函数设为私有
排除法:
A选项构造设置私有,不管是堆上创建对象,还是栈上创建对象,都不无法创建,故排除。
B选项析构函数私有,栈上不能创建对象,因为对象生命周期结束后,无法调用析构函数,而堆上可以创建对象,但需要定义一个释放对象的成员函数,用来手动释放堆区对象。
发表于 2023-05-11 12:29:01 回复(1)
  译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。  因此,   将析构函数设为私有,类对象就无法建立在栈(静态)上了,只能在堆上(动态new)分配类对象  ]
发表于 2016-10-06 20:30:02 回复(0)
new创建对象不需要析构函数,他有自己的delete函数完成释放,而创建过程中还是要调用构造函数
发表于 2016-04-20 20:36:26 回复(0)
只能通过new来创建,意思也就是说只能创建在堆上,可以将析构函数设为私有函数实现
分配在栈上的空间是连续的
分配在堆上的空间是间断的
发表于 2016-01-09 15:42:08 回复(0)
(转)因为栈上分配内存时,用完后会自动释放,所以会先检查析构函数是否可以调用,若不能调用则不能在栈上分配空间。 故只要将析构函数设为私有,即可限制内存的分配。
编辑于 2024-03-06 12:49:17 回复(0)
在c++中,类的建立分为两种,一种是静态建立,如A a,在栈空间中分配内存;一种是动态建立,即使用new,在堆空间中分配内存。
栈上分配内存时,用完后会自动释放,所以会先检查析构函数是否可以调用,若不能调用则不能在栈上分配空间。
故只要将析构函数设为私有,即可限制内存的分配。
编辑于 2022-07-29 10:28:30 回复(0)
1 析构函数是用来回收棧空间上的内存。如果析构函数私有化,编译器就无法回收棧空间而会出现编译错误。 2 destory函数负责堆上空间的释放,因此可以使用new来创建构造函数私有化的类的对象
发表于 2017-04-13 14:45:01 回复(0)
使我对编译工作有了更新的认识和更高的佩服。
发表于 2020-10-03 01:13:07 回复(0)
若类的析构函数是私有的,编译器将不会在栈空间上为类对象分配空间,这意味着不能直接创建对象,故选B。
编辑于 2019-03-05 00:08:45 回复(0)
涨知识了
发表于 2018-01-14 14:36:19 回复(0)
这题自己选A的时候就感觉不对,new也会调用构造函数啊。。私有析构函数,跟构造对象有关系吗,难不成选D?扯淡吧,还是选A吧
发表于 2017-09-02 15:43:33 回复(0)
构造函数作用为构造对象,若构造函数设为私有,则直接定义对象和使用new来创建对象都不可;
将析构函数设为私有,则创建的对象无法被释放,编译器报错
发表于 2017-07-11 10:41:43 回复(0)
记忆
发表于 2017-03-01 12:27:40 回复(0)
C++规则太多了!

发表于 2016-08-09 16:01:22 回复(0)
析构声明为 private, protected 都可以
发表于 2016-07-08 21:44:28 回复(0)