老沫白 发表于 2023-6-18 21:29:22

局部类求助

为什么局部类不能定义静态数据成员
为什么局部类不能使用所在函数的局部对象
希望标准回答能think as a compiler

sfqxx 发表于 2023-6-18 21:29:23

本帖最后由 sfqxx 于 2023-6-18 22:24 编辑

为什么局部类不能定义静态数据成员?
1. 静态数据成员在内存中是存在的,不属于某个对象,在编译期就已经确定它的存储位置和初始值。
2. 局部类被定义在函数内部,其作用域只在所在函数内部,因此无法为其定义静态数据成员。如果允许定义静态数据成员,则需要在编译期把这些数据插入到函数内部,这会导致编译器难以处理。

为什么局部类不能使用所在函数的局部对象?
1. 所在函数的局部对象只在函数内部的生命周期内存在,当函数返回时,它们被销毁。
2. 编译期间,编译器需要知道局部类成员的大小和布局等信息,在使用所在函数的局部对象时,编译器难以确定其生命周期,因此无法正确处理局部对象的引用或指针。

(Think as a compiler)
1. 编译期间需要确定对象的大小、布局和生命周期等信息,从而生成目标代码。
2. 局部类被定义在函数内部,其生命周期和作用域都受限于所在函数。
3. 静态数据成员需要在编译期分配空间,但由于局部类作用域的限制,编译器无法正确处理其位置和初始值。
4. 同样,使用所在函数的局部对象时,编译器也难以确定其生命周期,因此无法正确处理它们的引用或指针。

求最佳答案{:10_254:}

歌者文明清理员 发表于 2023-6-18 21:30:47

在C++中,静态数据成员对应的存储空间在程序编译时已经分配好了,在程序运行时只需要进行初始化即可。然而局部类是在函数内部定义的,它的生命周期也仅限于函数体内,因此无法保证静态数据成员被正确的初始化和使用。

另外,局部对象的生命周期同样只存在于函数体内部,一旦函数调用结束,这些对象就会被自动销毁。而局部类中使用所在函数的局部对象时,需要在局部类的成员函数中访问局部对象,但是当该成员函数被调用时局部对象已经被销毁了,因此无法访问。

作为编译器,它需要确保程序的语法正确性和代码的安全性。因此,C++标准规定了局部类不能定义静态数据成员和不能使用所在函数的局部对象,以避免出现不确定的行为和潜在的安全隐患。

老沫白 发表于 2023-6-19 10:46:24

sfqxx 发表于 2023-6-18 21:37
为什么局部类不能定义静态数据成员?
1. 静态数据成员在内存中是存在的,不属于某个对象,在编译期就已经 ...

第二个问题:也就是说"局部类是在编译时确定的,但在这时候局部变量是未知的,故不能使用局部变量"这个意思吗
第一个问题:
      我的知识储备不允许我知道"局部类的作用域在函数内"与"静态数据成员在编译时就有了以及生命周期到程序结束"有什么关系,即为什么类的局部作用域为什么会限制不能定义静态数据成员
      静态成员属于类不依赖于任何对象,难道说离开局部作用域,局部类就消失了吗,导致不能有static,再次调用函数重新定义局部类吗

老沫白 发表于 2023-6-19 10:55:51

歌者文明清理员 发表于 2023-6-18 21:30
在C++中,静态数据成员对应的存储空间在程序编译时已经分配好了,在程序运行时只需要进行初始化即可。然而 ...

歌兄,你的意思是局部类不是在编译时就确定的吗,每一次调用函数每一次再离开都会有局部类的重新定义和局部类的销毁吗,这样导致不能有static,那么这样说的话每一次调用函数定义局部类只要在局部类的定义之前定义了局部对象,那么不就能在局部类内使用局部对象了吗?

歌者文明清理员 发表于 2023-6-19 22:36:19

老沫白 发表于 2023-6-19 10:55
歌兄,你的意思是局部类不是在编译时就确定的吗,每一次调用函数每一次再离开都会有局部类的重新定义和局 ...

是的,您说得很对。局部类的定义和销毁确实是每一次函数调用都会发生的,这也就导致了静态数据成员无法正确地初始化和使用。而且,在您所说的情况下,如果在局部对象定义之前就先定义了局部类,则确实可以在局部类内使用该局部对象。具体来说,应该遵循以下步骤:


[*]在所在函数中定义一个局部对象。
[*]在局部对象定义之前定义局部类,并在该局部类的成员函数中使用该局部对象。
[*]使用该局部对象时,应该使用指向该局部对象的指针或引用,而不是直接使用该局部对象的名称。

需要注意的是,由于局部类的生命周期非常短暂,因此在使用局部对象的指针或引用时要格外注意,以避免出现未定义的行为。

比如https://fishc.com.cn/thread-229273-1-1.html里提到的错误
页: [1]
查看完整版本: 局部类求助