首页 > 试题广场 >

C++ 中,下面描述正确的是?

[单选题]
C++ 中,下面描述正确的是
int *p1 = new int[10]; 
int *p2 = new int[10](); 

  • p1和p2申请的空间里面的值都是随机值
  • p1和p2申请的空间里的值都已经初始化
  • p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化
  • p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()
发表于 2015-08-20 22:34:45 回复(23)
1,new单个变量,分配后返回一个指向相应空间的指针,不会初始化。new自定义类时,默认调用类的构造函数。
int *p = new int;
2.new 多个对象(数组),默认初始化。加空括号后进行值初始化。
int *p1 = new int[10];
int *p2 = new int[10]();
发表于 2020-12-28 17:53:26 回复(0)
在GCC7.4下测试,两个都会初始化为0
发表于 2019-04-05 10:22:29 回复(1)
来自@ 小杨你好
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()
发表于 2017-06-04 10:17:19 回复(0)
内置类型,new只分配内存,后面加(),相当于调用它的构造函数,所以值全部初始化为0;
自定义类型,只要调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()。
发表于 2017-05-23 22:27:34 回复(0)
()的作用是构造函数,有构造函数自然就被初始化了。
发表于 2017-04-08 22:17:02 回复(0)
new运算符只是申请分配一个内存空间而已,因为不知道为其分配对象的名称,所以分配之后返回的只是一个指向该对象的指针,并没有初始化,加上一个()后,就相当于调用了默认构造函数,会默认初始化,用0来初始化

发表于 2016-09-06 11:05:18 回复(1)
为什么我用在CFree下用C++,亲测都是随机值呢??
 请解释一下

发表于 2015-08-25 13:50:41 回复(5)
最初我还以为在堆上分配的内存都会自动初始化为0  但是我记错了 那个是全局区和静态变量区才是这样。
发表于 2015-08-22 16:36:59 回复(0)
http://blog.csdn.net/xiajun07061225/article/details/8796257
发表于 2015-08-12 22:28:22 回复(0)
对于int型的new 数组,默认赋值0吧,我在linux gcc下是这样的,不知道大家是什么样
发表于 2015-04-02 17:40:52 回复(2)
 int *p2 = new int[10]();申请了空间,而且进行了初始化int *p1 = new int[10];只申请空间,没有进行初始化原因:对于一些结构体,我们可以看到()往往表示构造函数,int是基本类型算初始化吧理由:你可以测试输出两种的值你会发现p1的值未知,而p2清零了
发表于 2015-03-10 20:47:29 回复(1)
在C++primer(第5版)中关于new的讨论有:
1、new当个对象
new在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象的指针。
int *pi = new int; // pi指向一个动态分配的,未初始化的无名对象
此new表达式在自由空间构造一个int类型对象,并返回指向该对象的指针。

默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值是无定义的,而类类型对象将用默认构造函数进行初始化

2、new(多个对象)数组
new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。
int *pia = new int[10];    // 10个未初始化int
int *pia2 = new int[10](); // 10个值初始化为0的int

编辑于 2015-06-28 10:35:13 回复(16)

默认情况下,new分配的对象,不管是单个分配的还是数组中的,都是默认初始化的。这意味着内置类型或组合类型的对象的值是无定义的,而类类型对象将用默认构造函数进行初始化。

 

int *pi = new int;                    // undefined
int *pia = new int[get_size()];       // undefined
Object *pio = new Object;             // invoke Object()

 

也可以对分配的对象进行显式值初始化,方法是在后面跟一对空括号,不过不支持对数组中对象初始化特定的值。

 

// ... means parameter list
int *pi = new int();                    // 0
int *pii = new int(1);                  // 1
int *pia = new int[get_size()]();       // 0 0 0..
int *piaa = new int[2](...);            // error: parenthesized initializer in array new
Object *pio = new Object(...);          // invoke Object(...)
Object *pio = new Object[size](...);    // error: parenthesized initializer in array new

 

另外C++ 11也提供了一个元素初始化器的花括号列表,支持对单个分配的和数组中的对象初始化为特定的值。

 

int *pi = new int{};                     // 0
int *pii = new int{1};                   // 1
int *pia = new int[get_size()]{};        // 0 0 0 ..
int *piaa = new int[2]{2, 1};            // 2 1
Object *o = new Object{};                // invoke Object()
Object *o = new Object{Object()};        // invoke Object()
Object *o = new Object[size]{Object()..};// invoke Object()..

 

从上面可以看出,空括号相当于传参,而花括号其实相当于赋值。这也解释了为什么空括号不支持对数组中对象初始化特定的值,而花括号却可以。

编辑于 2017-02-10 11:55:15 回复(0)
C
在《C和指针》这本书里有介绍,int *p1=new int[10];该语句给指针p1分配内存,没有对指针初始化, int *p2=new int[10]();该语句给指针p2分配内存,并初始化指针
编辑于 2021-11-18 10:16:04 回复(15)
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4下的测试结果:

发表于 2016-10-21 10:41:56 回复(3)
不管 new 的对象后有无(),都会调用自定义的适合的构造函数;只是内置类型无法自定义构造函数,对于它们new后面加否()是有区别的

编辑于 2017-09-01 13:32:23 回复(0)
int*p1 =newint[10];
为内置类型的默认初始化,即未定义值
int*p1 =newint[10]();
代表内置类型直接初始化,为0;
扩展:花括号表示的列表初始化。这样总结一下是不是就没那么难了?

发表于 2017-03-23 19:48:18 回复(2)
一般在heap中创建对象分为两步。
1.分配内存
2.在分配的内存上使用构造函数  
new int分配了内存
()则是在分配的内存上调用了构造函数

不知道我这么说对不对...
发表于 2015-05-07 22:13:57 回复(1)
都***垃圾题,应届生有几个能做这些题

发表于 2021-07-21 15:43:33 回复(0)