文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- 最近在B站看了黑马程序员的入门视频并自行练习职工管理系统的时候,想在类内定义一个静态的结构体来作为链表节点,发现了一些小问题,在此记录一下测试成果和理解。 **有什么问题欢迎指正**
- 一、`嵌套普通结构体`
- 1.方法1:类内定义匿名结构体
- 2.方法2:类外或类内定义结构体,并创建结构体变量
- 二、`嵌套静态结构体`
- 1.静态成员变量的组成
- 2.方法1:通过创建结构体变量实现
- 3.方法2:不创建结构体变量
- 总结
前言 最近在B站看了黑马程序员的入门视频并自行练习职工管理系统的时候,想在类内定义一个静态的结构体来作为链表节点,发现了一些小问题,在此记录一下测试成果和理解。
有什么问题欢迎指正 一、嵌套普通结构体 1.方法1:类内定义匿名结构体
class TEST
{
public:
struct
{
int a;
};
};
int main()
{
TEST A;
A.a = 0;//检测是否可以正常使用
}
根据图片可以发现编译器视匿名结构体成员为类成员,故不会调用结构体的构造函数,可以通过类对象调用结构体成员
// 类外定义结构体 // 类内定义结构体
struct test // class TEST
{ // {
int a; // public:
}; // struct test
// {
class TEST // int a;
{ // };
public: //
test m_test; // test m_test;
}; // };
//
int main() // int main()
{ // {
TEST A; // TEST A;
A.m_test.a = 0; // A.m_test.a = 0;
} // }
在类内或类外定义结构体并在类内创建结构体变量。
二、嵌套静态结构体 1.静态成员变量的组成静态成员由声明和定义组成,二者缺一不可。
class TEST
{
public:
static int test;//声明
}
int TEST::test = 0;//定义
2.方法1:通过创建结构体变量实现
class TEST
{
public:
struct test//结构体定义放在外面也行
{
int a;
};
static test m_test;//声明静态类成员
};
TEST::test TEST::m_test = { 0 };//定义静态类成员
int main()
{
TEST::m_test.a = 0;//无需创建对象,可以直接通过类名访问
}
这种方法不难理解,就是上文提到的先声明静态变量再将其定义
3.方法2:不创建结构体变量
class TEST
{
public:
struct test//结构体不能为匿名,否则将会报错“类TEST没有成员a”
{ //因为a被static修饰后作用域变为了TEST::<匿名类型>::a
static int a;//直接将结构体成员定义为静态
};
};
int TEST::test::a = 0;
int main()
{
TEST::test::a = 0;//可以双重作用域限定符直接调用
}
总结
1.类内匿名结构体成员被视为类成员
2.嵌套非匿名结构体需要创建结构体变量才能使用
3.想通过作用域访问而非对象,则需要创建结构体变量并用static修饰,将该变量作为静态成员(不可使用匿名结构体,因为无法声明)
4.也可直接用static修饰结构体成员,无需创建对象,但需要通过完整的作用域(类名::结构体名::静态成员名·)进行访问(不可使用匿名结构体,因为可以声明无法定义)
5.最后也可以使用匿名结构体,但是必须在结构体定义的同时完成创建变量(此方法有些特殊,将声明与定义相融合,省略了一些步骤)。
6.感谢阅读,这些结论全是自行测试得出,因为没查到具体的资料,如有错误欢迎指正:)



