我正在使用静态类变量,我碰到了一些我不明白的意外情况.
Stroustrup的书TC++ PL4在15.4.1非局部变量的初始化中说,"在不同的翻译单元中没有保证全局变量初始化的顺序." 但是看到多个翻译单元; 我没有测试文件之间的依赖关系,这是在一个文件中.同一部分说"原则上,在main()调用之前初始化在任何函数外部定义的变量(即全局,名称空间和类静态变量).翻译单元中的这些非局部变量按其定义顺序初始化.
如果我在文件的顶部设置它:
class Test1 {
public:
static double test1;
};
class Test2 {
public:
static double test2;
};
class Test3 {
public:
static double test3;
};
Run Code Online (Sandbox Code Playgroud)
我可以做这个:
double Test2::test2 = Test1::test1;
double Test1::test1 = 1.125;
Run Code Online (Sandbox Code Playgroud)
并将此语句放在main中以检查值:
cout << Test1::test1 << " " << Test2::test2;
Run Code Online (Sandbox Code Playgroud)
两个值都是1.125.我知道这两个变量都在这个范围内定义,但是如果它们按定义顺序初始化,那么上面的语句如何使用下面语句中的数据呢?此外,顶部的类定义顺序在任何这些情况下都不会改变.
如果我使用这种安排:
double Test2::test2 = Test1::test1;
double Test3::test3 = Test2::test2;
double Test1::test1 = 1.125;
Run Code Online (Sandbox Code Playgroud)
它们也都是1.125.
但如果我这样做:
double Test3::test3 = Test2::test2;
double Test2::test2 = Test1::test1;
double Test1::test1 = 1.125;
Run Code Online (Sandbox Code Playgroud)
Test3::test3 将是0. …
这个问题以前有人问过,但我觉得提问者在他从未真正得到真正的答案时匆忙地认为答案是正确的。可能没有什么原因,这个需要以后放到标准里,你告诉我。 不允许使用非成员函数重载 C++ 转换运算符的理由是什么
我正在寻找不允许将其作为当前标准设计的一部分的具体原因。基本上,当您重载强制转换运算符以定义两种类型之间的隐式转换时,此重载定义必须是您正在转换的类的成员,而不是类之外的东西。显而易见的问题是,如果您有类型由于某种原因确实无法修改,但为了语法的简单性(尽管隐式转换的缺点)或因为您有一堆其他依赖于隐式转换的代码、标准或自定义……如果您不能向类添加适当的隐式转换,则不能这样做,
另外,在类之外添加这些转换是否真的可能存在计算开销?在我看来,编译器很容易在弄清楚哪些函数可用时,将外部隐式转换函数与它们转换的类相关联,以便代码像它是该类的一部分一样执行就效率而言。唯一的缺点是它必须做一些额外的工作来建立初始关联,这应该几乎没有。
我不会将“因为标准这么说”或“因为隐式转换不好”作为答案。有人在编写实际标准时肯定有理由。
(我不是一个大专家,我还在学习这门语言。)
编辑,回复:嗯,我想情况可能是这样,是的,您更改了头文件,但是您不做的是覆盖现有的,因为那会很糟糕。您将根据旧的头文件创建一个新的头文件以适应更改。假设是旧代码已经在目标文件中编译,并且更改标头只会告诉编译器您在其他地方添加了其他代码。它不会改变旧代码的作用,因为它已经编译并且不依赖于它(即某些供应商交给您目标代码和标头)。如果我可以修改和重新编译我将使用转换的代码,那么你不能让我在外部编写转换函数,我不会这样做,这太混乱了。你不会 不必随机搜索每个标题以获得正确的定义;如果我自己编写代码,我会制作一个带有高度可见部分的自定义标头,其中我添加到供应商提供的标头中的内容是,并且所述标头对于它是哪个相对明显,因为它将与相关类型和其他标题将以其原始名称命名,因此您会知道它们没有更改。并且您将有一个仅包含转换定义的相应文件,因此我的修改将是独立的,与原始目标代码分开,并且相对容易找到。当然,这不包括在代码中找出应用哪个转换函数的实际努力。我想你可以找到各种各样的情况,“ 很容易确定,也很自然,可以在适合您自己的目的添加到这样的现有库中的地方使用。如果我使用的是我无法真正修改的商业代码,并且我看到可以通过使用转换函数将其与我自己的一些东西集成来改进我正在做的事情,我可以看到自己想要做的这个。当然,对于仅阅读 a = b 的第三人来说,这些事情并不明显,他们不会知道我的转换发生了什么,但是如果你知道并且读起来很好,那么它就可以工作。t 真的修改,我看到了一种情况,我可以通过使用转换函数将它与我自己的一些东西集成来改进我正在做的事情,我可以看到自己想要这样做。当然,对于仅阅读 a = b 的第三人来说,这些事情并不明显,他们不会知道我的转换发生了什么,但是如果你知道并且读起来很好,那么它就可以工作。t 真的修改,我看到了一种情况,我可以通过使用转换函数将它与我自己的一些东西集成来改进我正在做的事情,我可以看到自己想要这样做。当然,对于仅阅读 a = b 的第三人来说,这些事情并不明显,他们不会知道我的转换发生了什么,但是如果你知道并且读起来很好,那么它就可以工作。
我很欣赏关于标准决策如何运作的洞察力,这绝对是一种你可以忽略的边缘事物。