首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >*对抗。用于成员函数(C++)

*对抗。用于成员函数(C++)
EN

Stack Overflow用户
提问于 2014-06-06 06:15:29
回答 4查看 120关注 0票数 0

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

代码语言:javascript
复制
array<int,5> myarray;
int s=myarray.size();

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

代码语言:javascript
复制
auto t=chrono::high_resolution_clock::now();

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

代码语言:javascript
复制
chrono::high_resolution_clock myclock;
auto t=myclock.now();
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-06 06:20:24

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

(在您的示例中,THe high_resolution_clock是类,chrono是命名空间。这两种方法都使用::来表示“我想从{命名空间,类}中得到一些东西)”

票数 6
EN

Stack Overflow用户

发布于 2014-06-06 06:32:59

简单地说,::将名称与姓氏分开,而.将组件从子组件中分离出来。(请注意,在许多语言中,如C#、Java、D、.)没有这样的区别)

在第一个示例中,myarray是一个变量,其size()方法引用该特定变量。

代码语言:javascript
复制
array<int,5> myarray_a, myarray_b;
int sa=myarray_a.size();
int sb=myarray_b.size();

将分别给出myarray_ab的大小(而不是array<int,5>,即使对于这种特殊情况,-due -所有大小都是5)。

在第二个示例中,now()是类staticchrono::high_resolution_clock方法。

不管您是否有一个变量(以及chrono::high_resolution_clock类型的变量),这都不重要。该函数不引用变量,但对所有相同类型的变量都是相同的(概念上只有一个now,不管您要求的是谁)。

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

注意,size()函数的std::array是奇怪的:std::array的大小是编译时定义的,因此size()可能也是静态的。但是std::设计器允许它们作为成员(尽管constexpr,因此在编译时表达式中仍然可用)来保持与std::array或其他容器中相同的行为(在这些容器中,它必须是动态的,并且与变量相关联,因为每个大小在执行过程中都可能有所不同)。

票数 1
EN

Stack Overflow用户

发布于 2014-06-06 06:19:42

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24075403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档