我知道,给定一个类,比如std :: array,它有一个成员函数,比如size(),我们可以通过"。"来调用那个成员函数,是,在以下代码中,
array<int,5> myarray;
int s=myarray.size();
s是表示myarray大小的整数。当成员函数也可以由命名空间操作符&#34; ::&#34;调用时,会发生棘手的事情。例如,我知道以下代码行是有效的:
auto t=chrono::high_resolution_clock::now();
然后,采用我们最初用于数组的语法有什么不对?
chrono::high_resolution_clock myclock;
auto t=myclock.now();
答案 0 :(得分:6)
now()
是static
成员函数。这意味着函数本身没有隐藏的this
指针。相反,它就像一个常规函数 - 只是避免名称冲突的类的一部分。
(high_resolution_clock
是一个类,chrono
是一个命名空间,在你的例子中。两者都使用::
来表示“我想要来自{namespace,class}内部的东西”
答案 1 :(得分:1)
简单来说,::
将名称与姓氏分开,而.
将组件与子组件分开。 (请注意,在许多语言中,如C#,Java,D,......)没有这样的区别)
在您的第一个示例中,myarray
是一个变量,其size()
方法引用该特定变量。
array<int,5> myarray_a, myarray_b;
int sa=myarray_a.size();
int sb=myarray_b.size();
分别给出myarray_a
和b
的大小(不是array<int,5>
的大小,即使 - 在这种特殊情况下 - 所有大小都是5)
在第二个示例中,now()是类static
的{{1}}方法。
如果您有chrono::high_resolution_clock
类型的变量(以及多少个),则无关紧要。该函数不引用变量,但对同一类型的所有变量都有相同的作用(概念上只有一个chrono::high_resolution_clock
,无论你要求谁。)
因此,将now
作为变量的一部分,通过完全限定其名称是相同的。
请注意,now()
的{{1}}函数很奇怪:size()
的大小是定义的编译时间,因此std::array
可能有也是静态的。但是std::array
设计者将它们作为成员(虽然size()
,因此仍然可以在编译时表达式中使用)保留与std::
或其他容器(它必须是动态的,并且与变量相关联,因为每个大小可以在执行期间变化)
答案 2 :(得分:0)
你在这里混淆了两个概念: “::”用于命名空间,但也用于调用静态方法。
答案 3 :(得分:0)
使用您建议的语法没有错误。它有效。
但是它会创建一个对象,而::
版本不会创建任何对象。在创建该对象时似乎没什么意义,因为为了调用静态函数没有必要这样做。因此,在不创建对象的情况下调用静态函数更简单。