为什么我可以在未定义的函数和类中使用双冒号,但我不能在变量中使用?
示例:
#include <iostream>
using namespace std;
class Person{
public:
int age;
string name();
};
int Person::age = 10; //It outputs an error
string Person::name(){ //It doesn't
return "n";
}
答案 0 :(得分:3)
为什么我可以在未定义的函数和类中使用双冒号,但我不能在变量中使用?
age
是一个实例字段,它存在于内存中的多个位置 - 每个存在Person
一个。
我现在详细介绍::
运算符的作用,如何使用它,以及static
类成员与实例成员的比较:
::
运算符: ::
(scope-resolution operator)在C ++中有多种用途:
如果您熟悉Java,C#或JavaScript,那么它可以比作点解除引用或导航操作符&#34; .
(例如namespace.Class.Method().Result
) - 除了C ++使用不同的运算符进行不同类型的导航和解除引用:
.
是成员访问运算符,类似于C - 它仅适用于&#34;对象值&#34;和引用(foo&
),而不是指针(foo*
)。->
是指针类型的另一个成员访问运算符,请注意,此运算符可以被覆盖,但.
不能覆盖{over} ->
1}}是有风险的,但如果正确完成,它会改善智能指针库的人体工程学。)::
是范围解析运算符 - 它有一些不同的用途:
.
来导航包和命名空间,而C ++使用::
,例如:using std::time
。::std
如果您正在编写已经在命名空间中的代码,这将非常方便。static
成员(静态方法或字段),但也包括enum class
(作用域枚举)值等项(例如{ {1}})SomeEnumClass::value_name
方法实现时选择特定的基本方法:当重写的方法需要在超类中调用基本实现时使用它 - C ++没有C#和Java分别拥有的单个virtual
或base
关键字,因为C ++允许多重继承,因此您必须指定特定的父类名:How to call a parent class function from derived class function? 无论如何,在你的情况下,看起来你对实际和静态成员的实际含义感到困惑,所以这里有一个例子:
super