双结肠混淆

时间:2017-06-06 22:45:14

标签: c++

为什么我可以在未定义的函数和类中使用双冒号,但我不能在变量中使用?

示例:

#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";
}

1 个答案:

答案 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}}是有风险的,但如果正确完成,它会改善智能指针库的人体工程学。)
  • ::范围解析运算符 - 它有一些不同的用途:
    • 命名空间导航 - 而Java和C#使用.来导航包和命名空间,而C ++使用::,例如:using std::time
    • 当不合格时,它也用于引用全局命名空间,例如::std如果您正在编写已经在命名空间中的代码,这将非常方便。
    • 它还用于访问类型的静态成员 - 通常是实际的static成员(静态方法或字段),但也包括enum class(作用域枚举)值等项(例如{ {1}})
    • 最后,它还用于在处理SomeEnumClass::value_name方法实现时选择特定的基本方法:当重写的方法需要在超类中调用基本实现时使用它 - C ++没有C#和Java分别拥有的单个virtualbase关键字,因为C ++允许多重继承,因此您必须指定特定的父类名:How to call a parent class function from derived class function?

无论如何,在你的情况下,看起来你对实际和静态成员的实际含义感到困惑,所以这里有一个例子:

super