关于对象数组,不适用默认构造函数

SlasherBB 2013-06-27 01:48:58
我创建了一个了类A,现在想创建个对象数组来存储A的对象,但又不想使用默认的构造函数进行初始化。
class A{
public:
A(int ma):_ma(ma){}
private:
int _ma;
}

//现在想用创建一个10个元素的对象数组,每个元素都用5来初始化。
//A a[10]; //error
//A a[10](5); //error
...全文
243 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SlasherBB 2013-06-30
  • 打赏
  • 举报
回复
谢谢大家,结贴给分!
  • 打赏
  • 举报
回复
用 placement new
hugett 2013-06-27
  • 打赏
  • 举报
回复
改为A*数组。。然后一个个new。。或者改用vector。。
橡木疙瘩 2013-06-27
  • 打赏
  • 举报
回复
引用 5 楼 GSYzhu 的回复:
从C++的规范来讲,要想创建对象数组,类必须含有默认构造函数。 当然,对于不同编译器有不同的解释。 对于楼主的例子来说, A a[10] = { A(5),A(5),A(5),A(5),A(5), A(5),A(5),A(5),A(5),A(5) }; 可以满足,在VC下可以编译通过。当然,这只是VC自作聪明不符合C++规范的一个例子。 实质上,上述初始化对象数组的行为应当是使用默认构造函数创建对象数组,然后使用大括号中的构造函数初始化对象赋值给数组中的对象元素。
用列表形式初始化数组是符合C++标准的,不是VC的自作主张,这段代码没有问题。 唯一的问题是,如果我要A a[1000] ={?}
ether 2013-06-27
  • 打赏
  • 举报
回复
从C++的规范来讲,要想创建对象数组,类必须含有默认构造函数。 当然,对于不同编译器有不同的解释。 对于楼主的例子来说, A a[10] = { A(5),A(5),A(5),A(5),A(5), A(5),A(5),A(5),A(5),A(5) }; 可以满足,在VC下可以编译通过。当然,这只是VC自作聪明不符合C++规范的一个例子。 实质上,上述初始化对象数组的行为应当是使用默认构造函数创建对象数组,然后使用大括号中的构造函数初始化对象赋值给数组中的对象元素。
橡木疙瘩 2013-06-27
  • 打赏
  • 举报
回复
改用std::vector,它可以用拷贝构造函数来初始化。 std::vector<A> a(10, A(5));
AndyStevens 2013-06-27
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
class A{
public:
	A(int ma):_ma(ma){};
	void* operator new(size_t size, void* p){return p;}
private:
	int _ma;
};

int main(int argc, char *argv[])
{
	void *p = operator new[](10*sizeof(A));	
	A *pa = static_cast<A*>(p);
	for(int i=0;i<10;i++) new(pa+i) A(5);

	return 0;
}
www_adintr_com 2013-06-27
  • 打赏
  • 举报
回复
这样: #include <new> ... char buf_for_a[sizeof(A) * 10]; for(int i = 0; i < 10; ++i) { new (buf_for_a + i * sizeof(A)) A(10); } A* a = (A*)buf_for_a;
未注销 2013-06-27
  • 打赏
  • 举报
回复
//A a[10](5); //error 当时我就惊呆了。

64,637

社区成员

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

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