问一个用new分配数组的问题

the_venus 2011-06-16 08:55:06
#include<iostream.h>

class test
{
public:
test(int arg)
{
m_arg=arg;
}
~test()
{
}
int getarg()
{
return m_arg;
}
private:
int m_arg;
};

int main()
{
test *p=new test[5]{(1),(2),(3),(4),(5)};
for(test *q=p;q<p+5;q++)
{
cout<<q->getarg();
}
delete []p;
return 0;
}

这段程序在编译的时候为什么在new 那一行会报错呀,请问各位怎么改正?
...全文
318 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nano_Michael 2012-04-09
  • 打赏
  • 举报
回复
要用对象数组的话,构造函数必须是默认的,就是说你不用定义构造函数。
Ol_lO 2011-06-22
  • 打赏
  • 举报
回复
对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。当然这么写是可以的:test *p=new test[5]();
zz457887107 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 joyzml 的回复:]
引用 5 楼 sxjgxy2009 的回复:
test *p=new test[5];
这样写也不对呀,编译报错:“test”: 没有合适的默认构造函数可用。

那你给class test写一个defult构造函数
因为operator new首先分配内存
然后调用class test的defult构造函数初始化这块内存
如果class test没有defult构造函数,那肯定就出问……
[/Quote]
++1
the_venus 2011-06-22
  • 打赏
  • 举报
回复
谢谢7楼,你给我的小程序加了个缺省的构造函数,但是这样还是不行的,编译器通不过。
这个是编译时候的出错消息:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.cpp
test.cpp(27) : error C2143: syntax error : missing ';' before '{'
test.cpp(27) : error C2143: syntax error : missing ';' before '}'

就是第27行不行的。。。
我想这个是C++语言当时设计的时候没有考虑周到所留下的一个小的缺陷吧。
我原想,如果能够构造一个对象数组,并且在产生对象数组的时候程序能够从后面的{}里面提取参数并分别调用相应的构造函数就好了。。。。
编译器可以根据不同的参数分别调用不同的构造函数:
比如:
test *ptest=new test[5]{(),(2)};
那么程序运行到new时候就会先调用一个无参数的构造函数,再调用一个带参数的构造函数,后面再调用三次无参数的构造函数。
但是实际上,C++编译器做不到这一点,实在有点可惜。。。
但愿有一天C++编译器能支持这样做。。。。
还有一点,我记得export是C++关键字,在处理模板的编译的时候它很有用,但是没有哪个编译器支持。。。不知道是为什么。。。。
aa1013911535 2011-06-17
  • 打赏
  • 举报
回复
学习了。。
wangsifu2009 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 namelij 的回复:]
C/C++ code

#include<iostream.h>

class test
{
public:
test(int arg)
{
m_arg=arg;
}
test()
{
m_arg = 0;
}
~test()
{
}
int getarg()
{
return m_arg;
}
private:
int m_arg;
};

……
[/Quote]
这个可以运行??
QQIANQQ 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 joyzml 的回复:]
引用 5 楼 sxjgxy2009 的回复:
test *p=new test[5];
这样写也不对呀,编译报错:“test”: 没有合适的默认构造函数可用。

那你给class test写一个defult构造函数
因为operator new首先分配内存
然后调用class test的defult构造函数初始化这块内存
如果class test没有defult构造函数,那肯定就出问……
[/Quote]
++ more effective c++里边条目4讲的还蛮好的!建议看一下!
碎碎念 2011-06-16
  • 打赏
  • 举报
回复
test *p=new test[5]{(1),(2),(3),(4),(5)};这种写法确实不行。。。。
可以test *p=new test[5];之后利用一个循环赋值 p[i] = test(i+1);
zhanshen2891 2011-06-16
  • 打赏
  • 举报
回复
哈哈,这个新手够新的,看看书啊
ryfdizuo 2011-06-16
  • 打赏
  • 举报
回复
数组不可以这么初始化。
new后面圆括号可以初始化,调用对象的构造函数。
test *p=new test[5];
for (int i=0; i<5; i++) p[i] = i+1;
無_1024 2011-06-16
  • 打赏
  • 举报
回复
没这样写的吧
分开来 先分配空间在循环赋值
Mr_YWS 2011-06-16
  • 打赏
  • 举报
回复

初始化对象数组的方案是, 首先使用默认构造函数创建数组元素, 然后构造函数将创建临时对象, 然后将临时对象的内容复制到相应的元素中. 因此, 要创建类对象数组, 则这个类必须有默认构造函数.
  • 打赏
  • 举报
回复

#include<iostream.h>

class test
{
public:
test(int arg)
{
m_arg=arg;
}
test()
{
m_arg = 0;
}
~test()
{
}
int getarg()
{
return m_arg;
}
private:
int m_arg;
};

int main()
{
test *p=new test[5]{(1),(2),(3),(4),(5)};
for(test *q=p;q<p+5;q++)
{
cout<<q->getarg();
}
delete []p;
return 0;
}
给你个能运行的
GARY 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sxjgxy2009 的回复:]
test *p=new test[5];
这样写也不对呀,编译报错:“test”: 没有合适的默认构造函数可用。
[/Quote]
那你给class test写一个defult构造函数
因为operator new首先分配内存
然后调用class test的defult构造函数初始化这块内存
如果class test没有defult构造函数,那肯定就出问题了。
sxjgxy2009 2011-06-16
  • 打赏
  • 举报
回复
test *p=new test[5];
这样写也不对呀,编译报错:“test”: 没有合适的默认构造函数可用。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧