C++中如何显式调用构造函数

#include <new>

class A {

public:

A();

A(int);

...

};

A * pA = (A *) malloc( sizeof(A) );

new (pA) A; // 调用A()

A * pAA = (A *) malloc( sizeof(A) * 10 );

for (int i = 0; i < 10; ++i)

new (pAA + i) A(i); // 调用A(int)

以上用法也称为放置构造,它是与第三方内存管理的标准接口,必须 include <new> 后才能使用,因为它通过重载(全局的) operator new 来实现。

另外我们也可以通过重载 operator new 来实现定制的放置构造,例如:

// 实现一个 pool

class my_pool {

...

};

...

class A {

...

public:

// 重载 operator new 来实现从 pool 中分配对象,不重载全局 operator new 可以保证只有该类可以使用定制的放置构造方法

static void * operator new (size_t size, my_pool & pool) {

...

}

...

};

...

// 定制的放置构造用法

my_pool myPool;

A * pA = new (myPool) A;

参考:

operator new

allocator::construct

C++中如何显式调用构造函数

时间: 2024-10-13 19:33:48

C++中如何显式调用构造函数的相关文章

C++中构造函数详解及显式调用构造函数

C++构造函数详解及显式调用构造函数 c++类的构造函数详解                        一. 构造函数是干什么的class Counter{public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         {                m_value = 0;         }private:          // 数据成员         int m_val

C++不能显式调用构造函数,会生成匿名对象,这点与Java完全不一样!

Java有super(),但是C++里面没有.看一下这段代码: class A { public: A() { printf("A() \n"); } A(int d) { printf("A(int) \n"); A(); }  // 不能这样调用构造函数!会生成另一个匿名对象 ~A() { printf(" ~A \n"); } void ddd() { printf(" ddd \n"); } }; int main(i

C++构造函数详解及显式调用构造函数

一. 构造函数是干什么的class Counter{public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         {                m_value = 0;         }private:          // 数据成员         int m_value;}       该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员

Java中子类和父类的构造函数?

这篇文章总结了关于Java构造的常见??问题. 1)为什么创建一个子类对象要也需要调用父类的构造函数? class Super { String s; public Super(){ System.out.println("Super"); } } public class Sub extends Super { public Sub(){ System.out.println("Sub"); } public static void main(String[] a

Java中子类和父类的构造函数

这篇文章总结了关于Java构造的常见??问题. 1)为什么创建一个子类对象要也需要调用父类的构造函数? [java] view plain copy class Super { String s; public Super(){ System.out.println("Super"); } } public class Sub extends Super { public Sub(){ System.out.println("Sub"); } public stat

C++子类中显式调用基类函数

1 #include <iostream> 2 using namespace std; 3 4 class thebase { 5 public: 6 virtual void basePrint() { 7 cout << "the base class basePrint() function." << endl; 8 } 9 10 void basePrint2() { 11 cout << "the base clas

线程系列10,无需显式调用线程的情形

通常,我们会通过线程的构造函数先创建线程再使用线程.而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的.一些封装了多线程.异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)".以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式. BackgroundWorker类属性:WorkerSupportsCancellation:设置为true表示允许取消Worke

linux下动态链接库(.so)的显式调用和隐式调用

进入主题前,先看看两点预备知识. 一.显式调用和隐式调用的区别 我们知道,动态库相比静态库的区别是:静态库是编译时就加载到可执行文件中的,而动态库是在程序运行时完成加载的,所以使用动态库的程序的体积要比使用静态库程序的体积小,并且使用动态库的程序在运行时必须依赖所使用的动态库文件(.so文件),而使用静态库的程序一旦编译好,就不再需要依赖的静态库文件了(.a文件). 动态库的调用又分为显示和隐式两种方式,区别如下: 1. 隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接:而

Spring装配bean(在java中进行显式配置)

1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行显示配置方式很少使用.本文专门介绍第2种方式. 如果在项目中,我们需要将第三方库装配到spring中,这时候就没法使用隐式装配方式(没法在第三方库中加@Component等注解),这时候, 就需要在两种显式配置中选方法配置. 其中在java中进行显式配置方式是更好的方案,因为它更为强大.类型安全并且