首页 > 试题广场 >

请将下列构造函数补充完整,使得程序的运行结果是5

[单选题]
请将下列构造函数补充完整,使得程序的运行结果是5
#include<iostream>
using namespace std;
class Sample{
	public:
		Sample(int x){
			________
		}
		~Sample(){
			if(p) delete p;
		}
		int show(){
			return *p;
		}
	private:
		int*p;
};
int main(){
	Sample S(5);
	cout<<S.show()<<endl;
	return 0;
}
  • *p=x;
  • p=new int(x);
  • *p=new int(x);
  • p=&x;
 D : p = &x;  表示的是,对x取地址,赋值给指针p,那么p 将指向 x 的那块内存空间,但是 x  是形式参数(也有人说是方法参数,都可以),函数调用完了之后,内存就释放了,所以再返回 *p(即取出那块内存空间的值),已经找不到了。所以错误。
A :*p = x;  表示的是 将 x 的值赋值给 P 所指向的空间,而p之前并没有指向任何地方,这个操作将是非法的。
C:*p = new int(x);   这个操作同 A 的结果一样。
B  : p = new int(x);  new int(x) 新申请空间,调用完后不释放空间,所以将地址赋值给p 则p 指向了这段新申请内存空间,所以当做  *p 返回时,即取出p所执行空间的值,所以会输出5
发表于 2016-09-16 19:04:31 回复(6)
x是方法参数,则x的值和它所在的内存位置,都会在方法结束后失效,所以, 指针p不应该指向x的内存地址,而应该指向自己申请的一个地址空间,于是D错;而至于B和C,为何选B,由于 ‘p’和‘*p’,一个表示p指向的地址,一个则表示p指向的地址位置的值,所以,p = new int(x); 大致做了两件事:① 让p指向一个不会由于方法结束而失效的地址 ②将x值传给这个地址空间处, 所以最终,*p 也就是 p指向位置的值,就是x值。最终,选B。
发表于 2016-09-08 17:31:27 回复(1)
*p=x代表将p所指向的内存位置赋值为x,而x作为局部变量,在Sample函数调用结束后自动释放,p无处可指。所以需要分配一块空间
编辑于 2016-09-23 10:18:44 回复(10)
A.指针p是空指针,在调用构造函数Sample时,中断,提示0xCCCCCC。

B.是正确的,诀窍,看到delete就想到有new,他们最好成对出现。

C.编译不过,这个表达式,左边的类型是int * ,右边的是int,所以编译不过

D.编译通过,但结果不对,结果是使用过的栈地址,而且不被释放,导致程序终止异常

发表于 2017-05-09 09:35:21 回复(0)
P还没开辟空间,使用*p是会报错的
发表于 2016-12-09 12:35:32 回复(0)
作为android程序员已经懵逼,我还在想x是局部变量,函数结束后x的地址就没了,应该要新建一个空间赋值给p,但是int可以直接new我也是醉了.
发表于 2016-09-01 23:07:18 回复(0)

这个构造函数需要对指针p进行初始化,使得它指向一个动态分配的整数类型内存块,并将输入参数x的值存储到该内存块中。

因此,正确的选择是B:p = new int(x);。

这行代码使用了C++中的动态内存分配操作符new,new会分配一块大小为int的内存,并将其地址赋给p。new int(x)表示创建一个新的整型变量,其初值为x,并返回这个整型变量的地址。这样,指针p就可以访问这个新分配的整数类型内存块,并且该内存块的值为x。

发表于 2023-10-30 16:12:22 回复(0)
在DEV C++中简单的运行了一下,BD都能出现正确的结果
发表于 2017-04-11 09:55:44 回复(2)
选项A:p指针没有进行初始化,所以是野指针,对它进行赋值相当于对一块未知的区域进行赋值,所以直接就报错了,如果p在定义的时候已经初始化了(且初始化是非空的指针),那么A选项就是对的。
选项C:new int(x)返回的是一块内存的地址,该地址存放的值和x相等,那么既然是地址,当然只能使用指针来接收,但是选项C使用的是*p解引用后的来接收,当然不对
选项D:x形参,函数执行完就释放了,如果取x的地址,那么析构时候就会出现段错误,因为x申请的空间在函数执行完成后就释放了的
发表于 2022-03-11 14:36:03 回复(0)
descurctor里有delete,说明必须要new。
发表于 2022-02-05 11:06:22 回复(0)
如果这题private int *p在最前面是不是A就对了
发表于 2021-03-30 11:45:05 回复(0)
对C而言,p指针指向的值只是new出来的int的地址
发表于 2018-02-26 20:53:38 回复(0)

为什么我测试的D也可以呢
发表于 2018-02-05 21:31:29 回复(1)
指针在未分配内存之前不能赋值,门牌在分配房子之前不能代表住户
编辑于 2018-01-25 21:32:30 回复(0)
x是形参,不开辟新空间的话返回之后不能保留,所以要new
发表于 2017-11-05 19:59:21 回复(0)
D : p = &x;  表示的是,对x取地址,赋值给指针p,那么p 将指向 x 的那块内存空间,但是 x  是形式参数(也有人说是方法参数,都可以),函数调用完了之后,内存就释放了,所以再返回 *p(即取出那块内存空间的值),已经找不到了。所以错误。
A :*p = x;  表示的是 将 x 的值赋值给 P 所指向的空间,而p之前并没有指向任何地方,这个操作将是非法的。
C:*p = new int(x);   这个操作同 A 的结果一样。
B  : p = new int(x);  new int(x) 新申请空间,调用完后不释放空间,所以将地址赋值给p 则p 指向了这段新申请内存空间,所以当做  *p 返回时,即取出p所执行空间的值,所以会输出5
发表于 2017-09-25 10:15:12 回复(0)
*p = x;  表示的是 将 x 的值赋值给 P 所指向的空间,而p之前并没有指向任何地方,这个操作将是非法的。
*p = new int(x);   new int(x)返回的是一个地址。
发表于 2017-09-22 14:17:30 回复(0)
B
发表于 2016-11-13 22:16:22 回复(0)
c
发表于 2016-11-07 22:26:50 回复(0)
c
发表于 2016-10-27 18:28:40 回复(0)