“class classname* funcname(void)”在 C++ 中是什么意思?

roc*_*mon 35 c++

我在头文件中找到了以下代码,而“BOOT”类在另一个头文件中定义。

class BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)

它看起来像一个函数的声明,它以class.

Ren*_*ann 36

这是一个详细的类型说明符:

精心设计的类型说明符可用于引用先前声明的类名(类、结构或联合)或先前声明的枚举名称,即使该名称被非类型声明隐藏。它们也可用于声明新的类名。

https://en.cppreference.com/w/cpp/language/elaborated_type_specifier

取自 Artefacto 和 dfrib 的答案,因为它指出了这一点:它相当于:

class BOOT;
BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)

在您的示例中,如果尚不知道,它本质上会执行 BOOT 类的前向声明。struct Data* Data;从同一页面查看此示例:

struct Node {
    struct Node* Next; // OK: lookup of Node finds the injected-class-name
    struct Data* Data; // OK: declares type Data at global scope
                       // and also declares the data member Data
    friend class ::List; // error: cannot introduce a qualified name
    enum Kind* kind; // error: cannot introduce an enum
};
 
Data* p; // OK: struct Data has been declared
Run Code Online (Sandbox Code Playgroud)


Art*_*cto 21

它与此相同:

class BOOT;
BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)

所以它是一个指向 的指针class BOOT,但也带有类的声明。此时不需要定义类。


eer*_*ika 13

“class classname* funcname(void)”在 C++ 中是什么意思?

它是一个函数声明。

它看起来像一个函数的声明,它以“类”开头。

class classname*是函数的返回类型。class classname是一个详细的类型说明符。


dfr*_*fri 8

用于将class-name :s 引入其作用域的不同形式的前向声明

在 C++ 中,你可以声明一个函数类型,它的返回类型包含一个在别处定义的类类型,只要你在函数声明之前显式地向前声明类类型:

class BOOT;
BOOT* boot();
Run Code Online (Sandbox Code Playgroud)

但您也可以将前向声明内嵌在函数声明中:

class BOOT* boot();
Run Code Online (Sandbox Code Playgroud)

这是可以使用前向声明的地方之一,可能有点出乎意料。另一个例子是类型模板参数的模板参数列表:

template<typename T>
struct Identity { using type = T; };

using IdentityBoot = Identity<struct BOOT>;
//                            ^^^^^^^^^^^ also a forward declaration

// OK
BOOT* boot();

// OK
typename IdentityBoot::type* another_boot();
Run Code Online (Sandbox Code Playgroud)

详细的类型说明符可用于将名称引入其范围

正式地说,它是一个详细的类型说明符,由[dcl.type.elab] 管理

elaborated-type-specifier:
    class-key [...]
    [...]
Run Code Online (Sandbox Code Playgroud)

根据[class]/1,用于创建一个类名该类名被引入到使用详细类型说明符的范围中[强调我的]:

类是一种类型。它的名称成为其范围内类名([class.name]) [...]

类说明符详细类型说明符用于制作类名