为什么要使用';结构';C+;中类指针声明中的关键字+; 何时和为什么在C++中声明类指针变量时使用“结构”关键字?< /p>
我在嵌入式环境中看到过这一点,所以我怀疑这是C语言的一种保留。我看到了很多关于在C()中声明结构对象时何时使用“struct”关键字的解释,因为它与命名空间有关,但我找不到任何人谈论为什么在声明类指针变量时可能使用它 例如,在CFoo.h中:为什么要使用';结构';C+;中类指针声明中的关键字+; 何时和为什么在C++中声明类指针变量时使用“结构”关键字?< /p>,c++,class,variables,scope,elaboration,C++,Class,Variables,Scope,Elaboration,我在嵌入式环境中看到过这一点,所以我怀疑这是C语言的一种保留。我看到了很多关于在C()中声明结构对象时何时使用“struct”关键字的解释,因为它与命名空间有关,但我找不到任何人谈论为什么在声明类指针变量时可能使用它 例如,在CFoo.h中: 类CFoo { 公众: int doStuff(); }; 内联Foo::doStuff() { 返回7; } 后来在另一个班级: void CBar::interest() { 结构CFoo*pCFoo; //继续用pCFoo做一些有趣的事情。。。 }
类CFoo
{
公众:
int doStuff();
};
内联Foo::doStuff()
{
返回7;
}
后来在另一个班级:
void CBar::interest()
{
结构CFoo*pCFoo;
//继续用pCFoo做一些有趣的事情。。。
}
很少有理由这样做:这是C语言的后遗症,在这种情况下,程序员只是多愁善感——也许这是为了追求可读性。也就是说,它可以用来代替转发声明
在某些情况下,您可能需要消除歧义,但这里的情况并非如此。需要消除歧义的一个例子是
class foo{};
int main()
{
int foo;
class foo* pf1;
struct foo* pf2;
}
请注意,您可以交替使用class
和struct
。您也可以使用typename
,这在使用模板时非常重要。以下是有效的C++:
class foo{};
int main()
{
class foo* pf1;
struct foo* pf2;
typename foo* pf3;
}
这样做有两个原因 第一个问题是,如果我们打算在范围中引入一个新类型,使用一个详细的名称。这就是这个定义
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;
}
#包括
void CFoo(const class CFoo*c){std::cout在c中,两种不同的样式最常见:
typedef struct{…}s;
,变量声明为s name;
struct s{…};
,变量声明为struct s name;
<>在C++中,不需要<代码> TyPulfF/COD>省略<代码> Stutt关键字,所以前者的风格与C++类型和类更为接近,使它成为C++中最常见的样式。
但实际上,在实际使用“<代码>结构> <代码>而不是<代码>类<代码> >的情况下,C++中没有很多情况。结构本质上是所有成员都默认为公共的类。
原因可能是简单地,不必包含一个头文件,它的内容不需要用于发布。这CFoo
命名了一个类型。这通常通过转发声明完成:
class CFoo;
void f(CFoo*);
但也可以在飞行中完成:
void f(struct CFoo*);
不过请注意,尽管foo
只是一个“类”,但VS特别倾向于警告关键字切换不管您最初使用什么语法来定义它!@LightnessRacesinOrbit:如果您使用结构进行正向声明,然后使用类进行定义,那么MSVC编译不会失败吗?-Werror
的等价物肯定是:)(真正的答案是:我不知道;可能!)@芭丝谢芭哦,是的,忘了那个!@πάνταῥεῖ 再一次,坏的DUPE。这个问题是关于C++的。这个区别是问题的全部。请停止。把它作为一个C问题的一个复制并不是一个好主意。在C中这纯粹是一个风格问题。@ C++中的Lundin是一个风格问题。在C中是强制的。@如果你使用TyPulf,则不使用LynnEsraceSin轨道。这是C中最常见的样式。@Lundin好吧,这是作弊!这个问题不是关于使用类型别名,而是关于使用类型的实际名称及其限制/约束/要求。是的,你可以使用类型别名来绕过C中的上述要求。是的,这是非常常见的。不过,作为旁注,类似结构TM< /COD>未给出这种处理,所以它们也非常常见——即使在C++代码LOL中,结构也是默认情况下所有成员都是公共的类(尽管是1)@LightnessRacesinOrbit出于某种神秘的原因,STL函子曾一度被鼓励以结构而不是类的形式编写。尽管这很可能发生在C++98之前。我通常使用struct
来定义函子,因为它们没有状态,所以我只需编写privatE:很少(与 Pube:频繁),坦白地说,它只是“看起来更轻量级”(尽管这是一个谎言)。但是,“LexNexraceSeNe轨道”,我想我曾经从一本奇怪的小书中“一次用C++ STL设计组件”,2000年出版。给出了将函子写成结构体的奇怪理由:“struct这个词保存了公共标签。所有的东西都可以是公共的,因为这个类没有需要保护的数据。”这是真的,我想……他当时就把它称为类。嗯,如果我读对了,他的理由是“所有东西都可以是公共的,所以你可以使用结构体”,就好像说“结构中的一切都必须是公开的”。事实是,那不是真的。我的答案是掐一下。为美好的感觉投票吧!
void f(struct CFoo*);