:: 与 。成员函数(C ++)

时间:2014-06-06 06:15:29

标签: c++ oop

我知道,给定一个类,比如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();

4 个答案:

答案 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_ab的大小(不是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)

使用您建议的语法没有错误。它有效。

但是它会创建一个对象,而::版本不会创建任何对象。在创建该对象时似乎没什么意义,因为为了调用静态函数没有必要这样做。因此,在不创建对象的情况下调用静态函数更简单。