:对.用于成员函数(c++)

:: versus . for member functions (C++)

本文关键字:c++ 函数 成员 用于      更新时间:2023-10-16

我知道,给定一个类,比如std::array,它有一个成员函数,比如size(),我们可以通过一个"。"来调用这个成员函数,也就是说,在下面的代码中,

array<int,5> myarray;
int s=myarray.size();

s是表示myarray大小的整数。当成员函数也可以被命名空间操作符"::"调用时,就会发生棘手的事情。例如,我知道下面这行代码是有效的:

auto t=chrono::high_resolution_clock::now();

那么,使用我们最初用于数组的语法有什么问题呢?

chrono::high_resolution_clock myclock;
auto t=myclock.now();

now()static的成员函数。这意味着函数本身没有隐藏的this指针。相反,它就像一个普通的函数——只是类的一部分,以避免名称冲突。

(在您的示例中,high_resolution_clock是一个类,chrono是一个名称空间。两者都使用::来表示"我想从{namespace, class}内部获取一些东西"

简单来说,::将名称与姓氏分开,而.将组件与子组件分开。(请注意,在许多语言中,如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()是chrono::high_resolution_clock类的static方法。

是否有chrono::high_resolution_clock类型的变量(以及有多少)并不重要。该函数不引用变量,但对相同类型的所有变量都一样地工作(概念上只有一个now,无论您问谁)。

因此,调用now()作为变量的一部分,通过完全限定其名称是相同的。

注意,std::arraysize()函数很奇怪: std::array的大小是编译时定义的,因此size()也可以是静态的。但是std::设计者让它们作为成员(尽管constexpr,所以在编译时表达式中仍然可用)来保留与std::array或其他容器(它必须是动态的,并且与变量相关联,因为每个大小在执行期间可以变化)相同的行为

你混淆了两个概念:"::"用于命名空间,但也用于调用静态方法。

您建议的语法没有错误。它的工作原理。

但是它创建了一个对象,而::版本不创建任何对象。创建该对象似乎没有多大意义,因为没有必要为了调用静态函数而这样做。因此,直接调用静态函数而不创建对象更简单。