2014-06-06 70 views
0

我知道,给定一个类,说,具有成员函数,说,尺寸(),我们可以通过“。”调用该成员函数,即,在以下代码中,::与。为成员函数(C++)

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(); 
+0

你必须阅读'静态成员函数'。 –

+0

'now()'是一个静态成员函数。 – cbel

+0

http://stackoverflow.com/questions/4723143/c-static-member-functions – 101010

回答

6

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

(该high_resolution_clock是一类,chrono是一个命名空间,在你的榜样。两者都使用::,表示“我想要的东西从里面{空间,类})

+0

也许这引出了另一个问题:在'std :: array '的特殊情况下,为什么'size()'*不是静态成员函数? –

+1

因为STL的设计者希望它与'std :: vector'正交。 –

0

你是混合了2个概念在这里: “::”用于命名空间,也为呼叫静态方法。

+0

C++在这里混合了两个概念:-p – Will

0

没有什么的语法

但是它创建了一个对象,而::版本没有创建任何对象。创建该对象似乎没有多少意义,因为它不需要这样做以便调用静态函数,因此只需调用静态函数就简单多了创建对象。

+0

这太好了。谢谢!我其实更喜欢这种冗余,因为我现在处于学习阶段。 – user3713167

+0

“它创建一个对象”?真?你有这方面的来源吗?它会怎么做,哪个ctor? – MSalters

+0

@MSalters如果'X'是一个类,那么'X x;'(在函数或命名空间范围内)会创建一个'X'类型的对象'x'。你真的需要一个标准的参考吗? –

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>,即使-due这个特定区分所有尺寸将是5)

在第二示例中,现在()是一个static该方法chrono::high_resolution_clock

如果你有或没有变量(和多少)chrono::high_resolution_clock类型没有关系。该函数并不涉及变量,但对于相同类型的所有变量的作用是相同的(概念上只有一个now,不管你要求谁)。

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

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