首页 > 试题广场 >

假定Qiniuome是一个类,执行下面这些语句之后,内存里创

[单选题]
假定Qiniuome是一个类,执行下面这些语句之后,内存里创建了几个Qiniuome对象。
Qiniuome a();
Qiniuome b(2);
Qiniuome c[3];
Qiniuome &ra = b;
Qiniuome *pA = c;
Qiniuome *p = new Qiniuome(4);

  • 5
  • 6
  • 7
  • 8
推荐
答案是A
           Qiniuome a();是函数声明.
          Qiniuome b(2)和 Qiniuome c[3]创建总共4个;
          Qiniuome &ra = b和 Qiniuome *pA = c是指针和引用,不会创建对象
           Qiniuome *p = new Qiniuome (4);会创建一个
编辑于 2016-12-22 16:13:06 回复(18)
补充一下
创建10个元素大小的动态数组且分别对数组每个元素
调用接受一个int型参数4的构造函数的写法:
Qiniuome *p = new Qiniuome[10](4);

编辑于 2017-09-16 20:46:01 回复(0)
a是个函数声明!一不小心就搞错了
发表于 2017-01-04 20:29:53 回复(8)
CSomething a();//只是定义一个方法,方法返回一个CSomething对象 
CSomething b(2);//增加1个对象
CSomething c[3];//对象数组,增加3个对象
CSomething &ra=b;//引用不增加对象

CSomething *pA=c;//地址赋值,不增加对象
CSomething *p=new CSomething;//在堆上构造一个对象,增加1个对象


所以最后一共有: 1+3+1 =5个对象。

注: 
在C++语言里, 
String s2(s1); 
String s3 = s1; 只是语法形式的不同,意义是一样的,都是定义加初始化,都调用拷贝构造函数。 
下一个并非调用赋值运算符。

CSomething d=b;//调用拷贝构造函数,增加1个对象

发表于 2018-05-10 22:58:40 回复(1)
对于Qiniuome b(2),隐示调用构造函数,在进程虚拟地址空间中的栈中分配内存,跟他相似有显示调用: Qiniuome b = Qiniuome(2); 而我们常用的new关键字分配堆空间创建对象的方法是:Qiniuome *p = new Qiniuome(2);
对于第一行并没有调用构造函数创建对象,语法上如函数声明。如果想调用无参的构造函数,不需要括号。


编辑于 2017-09-19 19:58:49 回复(2)

i)类名 对象名

默认调用“对象名()”这个构造函数,在栈内存中存在对象名,在堆内存中存在实际对象;

ii)类名 对象名(一个或以上个参数)

默认调用相应的构造函数,在栈内存中存在对象名,在堆内存中也是存在实际对象的;

iii)类名 对象名()

不调用任何构造函数创建对象,仅在栈内在中存在对象名,在堆内存中并不存在实际的对象;

发表于 2018-04-12 13:46:56 回复(2)
Qiniuome a();是函数声明. 
Qiniuome b(2)和 Qiniuome c[3]创建总共4个; 
Qiniuome &ra = b和 Qiniuome *pA = c是指针和引用,不会创建对象 
Qiniuome *p = new Qiniuome (4);会创建一个 
发表于 2017-09-13 10:59:48 回复(1)
A项如果是Qiniuome a;就是一个对象了
发表于 2017-11-04 11:14:08 回复(0)
Qiniuome *p = newQiniuome(4); 生成匿名对象
Qiniuome a(); 是个函数声明
发表于 2017-05-14 17:02:03 回复(0)
(1)   第一个是申明一个返回值为Qiniunome的函数;
(2)   第二个是创建一个对象并初始化;
(3)   第三个是创建三个对象(一个Qinunome型数组);
(4-5)第四个和第五个为对象的引用和指针,并不会创建新的对象;
(6)   第六个new了一个对象,然后用指针来指向该对象。
因此一共创建了5个Qiniunome对象。
发表于 2020-02-25 22:33:18 回复(0)
我写了这样一个类,构造函数中使用了默认参数,那么在定义对象的时候,A_a a;这样的方式会调用我们自己写的构造函数,会使用里面的默认参数,但是A_a a();这么写就不会调用我们写的构造函数,编译器会把它当成是一个函数声明!!!
class A_a
{
public:
    A_a( int a = 2)
    {
        printf("A()\n");
    }
public:
    int a;
};
发表于 2018-08-02 14:16:56 回复(0)
如果第一个是默认参数,不是函数声明的话,应该是这样的吧? Qiniuome a;
发表于 2018-03-07 15:42:21 回复(0)
  1. Qiniuome a();这里并没有创建Qiniuome对象,而是声明了一个函数a,该函数的返回类型是Qiniuome,参数列表为空。这被称为“most vexing parse”,即“最令人困惑的语法解析”,因为它在某些情况下似乎会被误解为函数声明,而不是对象定义。要创建一个默认构造函数的Qiniuome对象,必须省略括号:Qiniuome a;

  2. Qiniuome b(2);这里创建了一个Qiniuome对象b,调用的是带有一个整数参数的构造函数。

  3. Qiniuome c[3];这里创建了一个Qiniuome数组c,包含3个默认构造函数的Qiniuome对象。

  4. Qiniuome &ra = b;这里创建了一个Qiniuome引用ra,它引用了b所引用的对象。不会创建新的Qiniuome对象。

  5. Qiniuome *pA = c;这里创建了一个Qiniuome指针pA,它指向c数组的第一个元素。不会创建新的Qiniuome对象。

  6. Qiniuome *p = new Qiniuome(4);这里创建了一个Qiniuome对象,通过调用带有一个整数参数的构造函数,并返回其地址。这个对象是通过new运算符在堆上动态分配的,需要手动释放内存。所以,总共创建了5个Qiniuome对象。

发表于 2023-10-30 14:58:31 回复(0)
Qiniuome a();             //这是个函数啊!千万别误会了
Qiniuome b(2);           //1个
Qiniuome c[3];            //3个
Qiniuome &ra = b;      //0个,引用相当于别名
Qiniuome *pA = c;      //0个,pA只是指针
Qiniuome *p = newQiniuome(4); //new 后面创建了1个

所以一共5个。
发表于 2018-01-20 11:27:57 回复(0)
临时对象是  类名(),类名  名称()表函数声明
发表于 2024-03-06 09:22:37 回复(0)
a() 是函数申明,不是创建对象
发表于 2022-07-13 15:05:41 回复(0)
无参构造函数不能 Q a(),以往经常犯这样的错,用gcc应该是无法编译通过的。 写成 Q a = Q() 应该比较好注意。
发表于 2022-03-23 22:15:41 回复(0)
原来第一个是个函数声明,我以为是省略了初值的实例化
发表于 2022-02-26 08:50:16 回复(0)
#include <iostream>
using namespace std;
class
    A
{
public:
    int a = 0;

};

int main()
{
    A a1;//调用默认构造函数,生成对象
    A a();//函数声明没有创造对象
    cout << a.a;//报错:a不是类

}
发表于 2021-11-25 14:50:12 回复(0)

Type a; 是调用默认的无参构造函数

Type a(); 是函数声明

发表于 2020-01-14 20:43:15 回复(1)
Qiniuome a(); // 这是一个函数声明,如果调用默认构造的话不会出现括号
发表于 2019-08-16 15:36:09 回复(0)