在c++中如何用new生成一个构造函数带参数的类数组(转载整理)
来源:互联网 发布:淘宝e客服怎么取消 编辑:程序博客网 时间:2024/06/04 18:25
楼主
在c++中如何用new生成一个构造函数带参数的类数组?比如
#include<iostream.h>
class member
{
public:
member(int id)
{
cout<<id<<endl;
}
};
void main()
{
int *a;
a=new int[100];
for(int i=0;i<100;i++)
a[i]=i;
//想要用new动态定义一个member数组[100]
//并用a中的元素作为参数对应初始化member数组
//如member a[90](a[90]);
}
//主要是语法不会,希望大侠帮帮忙
作者:bruceteen 发表时间:2007-12-18 15:32:00
第1楼
#include <iostream>
#include <new>
using namespace std;
class foo
{
public:
explicit foo( int id=0 ) : id_(id)
{
cout << __FUNCTION__ << " " << id_ << endl;
}
~foo()
{
cout << __FUNCTION__ << " " << id_ << endl;
}
private:
int id_;
};
int main()
{
int a[2] = { 0, 1 };
// 第一种方法
{
foo b[2] = { foo(a[0]), foo(a[1]) };
}
cout << "-----------------" << endl;
// 第二种方法
{
char _b_buf_[ sizeof(foo)*2 ];
foo (&b)[2] = (foo(&)[2])_b_buf_;
for( size_t i=0; i<2; ++i )
{
new(&b[i]) foo( a[i] );
}
// ...use b
for( size_t i=0; i<2; ++i )
{
b[2-1-i].~foo();
}
}
cout << "-----------------" << endl;
// 这估计就是你要的了,和第二种方法一样
{
foo* p = (foo*)operator new( sizeof(foo)*2 );
for( size_t i=0; i<2; ++i )
{
new(&p[i]) foo( (int)i );
}
// ...use b
for( size_t i=0; i<2; ++i )
{
p[2-1-i].~foo();
}
operator delete( p );
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
用法的正确方法应该如何操作
- C++ new用法的正确方法应该如何操作?
- 在这篇文章中我们将会根据其两种不同的含义分别介绍一下它的影音方法,希望能给大家带来一些帮助。
C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。
C++ new用法之一 new运算符
最常用的是作为运算符的new,比如:
string *str = new string(“test new”);
作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。
new会在堆上分配一块内存,并会自动调用类的构造函数。
C++ new用法之二 new函数
第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:
void *operator new(size_t size);
new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。
如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:
- string *str = (string*)operator new(sizeof(string));
- str.string(“test new”);
- // 当然这个调用时非法的,但是编译器是没有这个限制的
这还不算完,还有第三种的new存在。
C++ new用法之三 placement new
第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:
new (buffer) type(size_t size);
先看看下面的代码:
- char str[22];
- int data = 123;
- int *pa = new (&data) int;
- int *pb = new (str) int(9);
结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。
为了使用placement new 你必须包含<new>或者<new.h>
其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:
void *operator new(size_t, void* buffer);
它看起来可能是这个样子:
void *operator new(size_t, void* buffer) { return buffer;}
和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。
总结
1. 函数new
void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。
2. 运算符new
最常用的new,没什么可说的。
3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。
4. 函数new允许重载,而运算符new不能被重载。
5. 紧接着就是对应的delete。
以上就是对C++ new用法的详细介绍。
- 在c++中如何用new生成一个构造函数带参数的类数组(转载整理)
- 如何用栈的方式初始化一个带参构造函数的对象数组
- 如何用Class_forName方法动态加载构造方法带参数的类
- 如何用Class.forName方法动态加载构造方法带参数的类
- C++ 中如何用 vector类作为函数的参数
- C++ 中如何用 vector类作为函数的参数
- C++ 中如何用 vector类作为函数的参数
- 如何用C语言实现带参数的dos命令?
- 如何用private 构造函数生成instance
- Java中 每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法
- 在层次结构中添加带参数的构造函数
- 如何用C#在Excel中生成图表?
- 如何用C#在Excel中生成图表
- 【程序这样写真别扭】new 一个匿名抽象类 带构造函数参数
- 在子类中调用父类的带参数的构造函数
- 在子类中调用父类的带参数的构造函数
- 在子类中调用父类的带参数的构造函数
- 类的继承中带参数的构造函数
- JAVA中菜单组件的实例:文本编辑器
- 号外:BlackBerry 6.0 开发工具,9800 OS 6.0模拟器已公开发布!
- 磁珠,磁珠工作原理,与电感区别,磁珠的选型以及在开关电源中的应用(转)
- 终于能跟大家学习了
- 关于C和C++头文件的小记
- 在c++中如何用new生成一个构造函数带参数的类数组(转载整理)
- 飞屏的简单实现
- 笔记: Lua标准库: table函数, 数学函数, 字符串函数/格式化/配对, WoW新增函数, 函数别名
- PCB 设计工作流程
- 飞秋_常用正则表达式集锦
- ddddddddddddddddddddddddd
- 爱相随
- link
- Oracle 约束