3

在 C++ 中声明类指针变量时,何时以及为什么要使用“struct”关键字?

我在嵌入式环境中看到了这一点,所以我怀疑这是 C 的某种保留。我已经看到了很多关于在声明结构对象时何时使用“struct”关键字的解释,因为它与 C 中的命名空间有关(在这里),但我找不到任何人谈论为什么在声明类指针变量时可能会使用它。

例如,在 CFoo.h 中:

class CFoo
{
public:
    int doStuff();
};

inline Foo::doStuff()
{
    return 7;
}

后来在不同的班级:

void CBar::interesting()
{
    struct CFoo *pCFoo;

    // Go on to do something interesting with pCFoo...
}
4

4 回答 4

7

很少有这样做的理由:它是 C 语言的错误,在这种情况下,程序员只是多愁善感——也许是为了追求可读性。也就是说,它可以用来代替前向声明。

在某些情况下,您可能需要消除歧义,但此处并非如此。需要消歧的一个例子是

class foo{};

int main()
{
    int foo;
    class foo* pf1;
    struct foo* pf2;
}

请注意,您可以使用classstruct互换。您也可以使用typename这在使用模板时可能很重要。以下是有效的 C++:

class foo{};

int main()
{    
    class foo* pf1;
    struct foo* pf2;
    typename foo* pf3;
}
于 2019-08-21T13:39:03.503 回答
5

这样做有两个原因。

第一个是如果我们要使用详细名称在范围中引入新类型。在这个定义中

void CBar::interesting()
{
    struct CFoo *pCFoo;

    // Go on to do something interesting with pCFoo...
}

struct CFoo如果尚未声明新类型,则在范围中引入新类型。指针可能指向不完整的类型,因为指针本身就是完整的类型。

第二个是当一个类的名称被函数或变量的声明隐藏时。在这种情况下,我们再次需要使用详细的类型名称。

这里有些例子

#include <iostream>

void CFoo( const class CFoo * c ) { std::cout << ( const void * )c << '\n'; }

class CFoo
{
public:
    int doStuff();
};


int main() 
{
    class CFoo c1;

    return 0;
}

或者

#include <iostream>

class CFoo
{
public:
    int doStuff();
};

void CFoo( void ) { std::cout << "I am hidding the class CGoo!\n"; }

int main() 
{
    class CFoo c1;

    return 0;
}
于 2019-08-21T13:43:57.150 回答
2

在 C 语言中,两种不同的风格是最常见的:

  • typedef struct { ... } s;变量声明为s name;.
  • struct s { ... };变量声明为struct s name;

在 C++ 中不需要typedef省略struct关键字,所以前者风格更符合 C++ 类型系统和类,是 C++ 中最常见的风格。

但是,在 C++ 中,当您真正想要使用struct而不是class首先使用的情况并不多 - 结构本质上是类,默认情况下所有成员都是公共的。

于 2019-08-21T13:54:21.350 回答
2

这样做的原因可能很简单,因为不必包含一个头文件,其内容除了用于宣布CFoo命名一个类型之外不需要其内容。这通常通过前向声明来完成:

class CFoo;
void f(CFoo*);

但它也可以即时完成:

void f(struct CFoo*);
于 2019-08-21T14:05:58.530 回答