我知道我们可以使用范围解析运算符在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使用此技术来调用复制构造函数.这样,它只需要做一个副本,而不是创建一个空对象并使用赋值运算符.
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)
... 例如.
除此之外,我没有看到实用程序.当我太小的时候,我只是在其他代码中调用了构造函数,无法知道我在做什么......