首页 > 试题广场 >

以下定义错误的是?

[单选题]
以下定义错误的是:
  • struct A{A  _a;};
  • struct A{A* _a;};
  • struct A{A& _a;};
  • struct B;
    struct A{B& _b;};
    struct B{A& _a;};
推荐
答案:A
解释:struct成员类型不可以是它自己。
因为会递归定义。
理论上这样导致结构体的大小不能被计算(无限大小)。所以不能在结构体里的成员类型是结构体本身。
但是成员可以定义为该结构体的指针。就像你上面这段代码。因为指针的大小是已知的(随编译器和操作系统而定)。
所以可以定义为该结构体的指针,但不是该结构体。

编辑于 2015-02-04 20:09:05 回复(3)
递归定义
发表于 2016-07-12 22:55:25 回复(0)
结构体在完成定义之前是incomplete type(不完全类型),不完全类型不能定义对象,只能定义引用和指针,或者用于声明函数的形参和返回值类型。
发表于 2016-05-07 22:46:32 回复(0)
选A难道不是因为A里少了个分号么...
发表于 2017-07-21 10:44:04 回复(8)
结构体不能被递归定义,这样会导致其大小无法被计算(无限大)
发表于 2018-03-21 12:53:39 回复(2)
结构体内不定义自己我知道,那定义自己的引用呢?谁能解释下c
发表于 2017-01-01 23:20:26 回复(3)
如果再定义一个自己的话,会出现死循环循环调用构造函数。。。(结构体类似于类)
发表于 2015-06-28 07:54:16 回复(0)
结构体成员包含结构体本身的话,会无限嵌套,导致结构体的大小不能被计算。

结构体递归定义应该包含指向本身的指针,比如
struct NodeList
{
   someType   NodeData(假定4个字节);
   NodeList*    pNextNodeList;
}
发表于 2017-12-05 16:16:14 回复(0)
解释:struct成员类型不可以是它自己。
因为会递归定义。
理论上这样导致结构体的大小不能被计算(无限大小)。所以不能在结构体里的成员类型是结构体本身。
但是成员可以定义为该结构体的指针。就像你上面这段代码。因为指针的大小是已知的(随编译器和操作系统而定)。
所以可以定义为该结构体的指针,但不是该结构体。
发表于 2016-05-23 16:01:58 回复(0)
结构体成员类型不能是该结构体本身:

结构体内存大小还没确定,编译器无法得知内存占用。而定义结构体的指针就没问题,因为指针在win32下都是4字节
发表于 2021-08-07 16:57:51 回复(0)
struct成员类型不可以是它自己
发表于 2022-07-28 16:55:15 回复(0)
如果定义引用的话,必须在定义时就初始化。
发表于 2020-07-23 17:32:21 回复(0)
A是错的,因为会递归定义。 理论上这样导致结构体的大小不能被计算(无限大小)。所以不能在结构体里的成员类型是结构体本身。 
但是成员可以定义为该结构体的指针。就像你上面这段代码。因为指针的大小是已知的(随编译器和操作系统而定)。 所以可以定义为该结构体的指针,但不是该结构体。
发表于 2017-09-05 09:09:24 回复(0)
来自@墨儿
解释:struct成员类型不可以是它自己。
因为会递归定义。
理论上这样导致结构体的大小不能被计算(无限大小)。所以不能在结构体里的成员类型是结构体本身。
但是成员可以定义为该结构体的指针。就像你上面这段代码。因为指针的大小是已知的(随编译器和操作系统而定)。
所以可以定义为该结构体的指针,但不是该结构体。
发表于 2017-05-26 11:15:44 回复(0)
C++中引用是编译器通过指针实现的,但这个实现在语言层面对程序员做了透明化处理
可以看出,对于引用,结构体还是按指针类型为其分配内存空间的。
下图A的写法可以通过编译,骗过编译器,但是就像不能派生的抽象类一样无法使用

编辑于 2017-04-07 17:23:54 回复(0)

C++ 中的结构体和类都不能直接包含自身作为成员变量,无论是通过值方式还是引用方式。这是因为在编译期间,编译器需要确定结构体或类的大小,而包含自身作为成员变量会导致大小无限增大,从而无法确定对象的大小。

因此,在选项 D 中,结构体 A 和 B 互相引用对方是不合法的。正确的做法是使用指针或引用进行间接的引用。

对于选项 Cstruct A{A& _a;};,它的定义是合法的。在 C++ 中,结构体可以包含引用类型的成员变量,只要满足以下两个条件:

  1. 引用类型的成员变量在创建对象时必须进行初始化,指向已经存在的对象。

  2. 引用类型的成员变量一旦被初始化,就不能再重新指向其他对象。

在选项 C 的定义中,结构体 A 包含一个引用类型的成员变量_a,并没有违反上述条件。但需要注意的是,使用该结构体创建对象时,需要确保_a成员变量指向一个有效的对象,否则会导致未定义的行为。


发表于 2023-10-18 21:13:08 回复(0)
我还是不是很能理解选项d能正确,引用的话需要初始化,没有初始化定义的引用,是被当作全局变量了吗然后初始化为0,怎么看都感觉这个d不对

发表于 2023-08-28 21:44:03 回复(0)
struct成员类型不可以是它自己
发表于 2017-03-20 16:34:18 回复(0)
求教,C对吗? 引用必须初始化,C并没有初始化,D也是引用都没有初始化
发表于 2024-05-27 10:32:12 回复(0)
结构体不能被递归定义,参考拷贝构造函数的参数传递注意事项。
发表于 2023-11-22 19:01:03 回复(0)
mark。结构体中成员类型不能是自身,否则会无线递归自己。
发表于 2023-08-08 21:06:37 回复(1)