如何在新调用中使用更多参数

How can I use more parameters in a new call?

本文关键字:参数 调用 新调用      更新时间:2023-10-16

对不起,如果"新调用"不是C - 术语。如果不是,请告诉我正确的术语。我是C 开始的C程序员。我有struct A,我想使用new操作员中的参数仪对其进行初始化。这样:

A* a = new A(foo, baa);

所以,我尝试使用它定义函数: void* A::operator new(T a, T B) { ... }

但是我得到了一个编译器 - eRror:

error: 'operator new' takes type size_t ('unsigned int') as first parameter

另外,不确定它是否相关,但是已经定义了size_t类型的过载参数的功能:

void* A::operator new(size_t size) { ... }

您无需为此超载operator new。您只想要一个构造函数:

class A
{
    public:
        A(FooType foo, BaaType baa);
};
A::A(FooType foo, BaaType baa)
{
    // initialize object here
}

然后您可以写(假设您已经获得了FooType类型的foo等):

A *a = new A(foo, baa);

在C 中完成的方式是让A。

的非默认构造函数
struct A {
  int a;
  int b;
  explicit A(int a_, int b_) : a(a_), b(b_) {}
};
...
A * a = new A(1, 2);
assert(a->a == 1);
assert(a->b == 2);

结肠后的表达式(:)是构造函数的初始化列表 - 它们在施工过程中执行成员的初始化。它们通常比更C型的变体更有效:

A::A(int a_, int b_) { a = a_; b = b_; }

在惯用的C 中,您始终希望在可能的情况下使用初始化列表。您也不想使用裸钉,所以最好写:

std::shared_ptr<A> a(new A(1, 2));
// or
std::unique_ptr<A> a(new A(1, 2));

shared_ptr适用于何时可能需要保存该实例,并且没有明确的范围应该存在。unique_ptr适用于应有对象存在的明确范围。unique_ptrdelete a脱离范围。当最后一个shared_ptr引用给定对象不范围时,shared_ptr将执行删除。

使用explicit关键字的原因是防止在自动转换中使用给定的构造函数。在pre-c 11次中,它对多拨构构建体没有影响。但是在C 11中,当您使用Brace Intialization时会产生影响。

您需要区分new操作员和构造函数:new操作员无所作为,而不是malloc(),它们分配了一个内存的一巴掌。然后,构造函数初始化了该记忆的一巴掌,以使其成为类型A的有效对象。

您的混乱源于以下事实,即new关键字同时可以分配和构造。线

A* foo = new A(...);

首先调用new操作员获取内存,然后调用适当的构造函数,传递给定参数,构造对象。

因此,正如其他人已经指出的那样,您需要添加带有所需参数的构造函数,而不是new操作员:

class A {
public:
    A(int arg1, int arg2);
    int member1, member2;
};
A::A(int arg1, int arg2) : member1(arg1), member2(arg2) {
    //Do additional stuff that cannot be achieved by calling the constructors of the members alone.
}

请注意,在此代码中,您可以在初始化器列表中明确调用A数据成员的构造函数(:{之间的零件。