Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要使用';结构';C+;中类指针声明中的关键字+; 何时和为什么在C++中声明类指针变量时使用“结构”关键字?< /p>_C++_Class_Variables_Scope_Elaboration - Fatal编程技术网

为什么要使用';结构';C+;中类指针声明中的关键字+; 何时和为什么在C++中声明类指针变量时使用“结构”关键字?< /p>

为什么要使用';结构';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做一些有趣的事情。。。 }

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

例如,在CFoo.h中:

类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*);