为什么在C++中显式调用构造函数

Arn*_*shn 21 c++ constructor

我知道我们可以使用范围解析运算符在C++中显式调用类的构造函数,即className::className().我想知道我究竟需要在哪里打电话.

Cha*_*lie 44

您有时也明确使用构造函数来构建临时文件.例如,如果你有一个带有构造函数的类:

class Foo
{
    Foo(char* c, int i);
};
Run Code Online (Sandbox Code Playgroud)

和一个功能

void Bar(Foo foo);
Run Code Online (Sandbox Code Playgroud)

但你没有Foo,你可以做到

Bar(Foo("hello", 5));
Run Code Online (Sandbox Code Playgroud)

这就像演员.实际上,如果你有一个只接受一个参数的构造函数,那么C++编译器将使用该构造函数来执行隐式转换.

在已存在的对象上调用构造函数是不合法的.也就是说,你做不到

Foo foo;
foo.Foo();  // compile error!
Run Code Online (Sandbox Code Playgroud)

无论你做什么.但是你可以在不分配内存的情况下调用构造函数 - 这就是new的用途.

char buffer[sizeof(Foo)];      // a bit of memory
Foo* foo = new(buffer) Foo();  // construct a Foo inside buffer
Run Code Online (Sandbox Code Playgroud)

你给了一些新的内存,它在那个位置构造对象而不是分配新的内存.这种用法被认为是邪恶的,在大多数类型的代码中很少见,但在嵌入式和数据结构代码中很常见.

例如,std::vector::push_back使用此技术来调用复制构造函数.这样,它只需要做一个副本,而不是创建一个空对象并使用赋值运算符.

  • +1表示新的展示位置.这很奇怪,但如果你知道自己在做什么就会很有用. (6认同)

Kla*_*aim 14

通常,在需要一些参数的子类构造函数中:

class BaseClass
{
public:
    BaseClass( const std::string& name ) : m_name( name ) { }

    const std::string& getName() const { return m_name; }

private:

    const std::string m_name;

//...

};


class DerivedClass : public BaseClass
{
public:

    DerivedClass( const std::string& name ) : BaseClass( name ) { }

// ...
};

class TestClass : 
{
public:
    TestClass( int testValue ); //...
};

class UniqueTestClass 
     : public BaseClass
     , public TestClass
{
public:
    UniqueTestClass() 
       : BaseClass( "UniqueTest" ) 
       , TestClass( 42 )
    { }

// ...
};
Run Code Online (Sandbox Code Playgroud)

... 例如.

除此之外,我没有看到实用程序.当我太小的时候,我只是在其他代码中调用了构造函数,无法知道我在做什么......

  • 当构造派生类的实例时,C++会隐式调用父类的构造函数,但它会调用默认构造函数 - 除非您在初始化列表中自己显式调用特定的父类构造函数. (4认同)