:对.用于成员函数(c++)
:: versus . for member functions (C++)
我知道,给定一个类,比如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_a
和b
的大小(不包括array<int,5>
,即使-由于这种特殊情况-所有大小都将为5)
在第二个例子中,now()是chrono::high_resolution_clock
类的static
方法。
是否有chrono::high_resolution_clock
类型的变量(以及有多少)并不重要。该函数不引用变量,但对相同类型的所有变量都一样地工作(概念上只有一个now
,无论您问谁)。
因此,调用now()
作为变量的一部分,通过完全限定其名称是相同的。
std::array
的size()
函数很奇怪: std::array
的大小是编译时定义的,因此size()
也可以是静态的。但是std::
设计者让它们作为成员(尽管constexpr
,所以在编译时表达式中仍然可用)来保留与std::array
或其他容器(它必须是动态的,并且与变量相关联,因为每个大小在执行期间可以变化)相同的行为
你混淆了两个概念:"::"用于命名空间,但也用于调用静态方法。
您建议的语法没有错误。它的工作原理。
但是它创建了一个对象,而::
版本不创建任何对象。创建该对象似乎没有多大意义,因为没有必要为了调用静态函数而这样做。因此,直接调用静态函数而不创建对象更简单。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗