c ++表示法 - 名称空间 - 类 - 函数

时间:2014-09-25 11:56:40

标签: c++ notation

我正在按照一个简单的教程来创建DLL。 在这个过程中,我对cpp文件中的一些符号感到有点困惑

dll.h - the header file
#blablablabla
namespace TutTest {
    class TutTestClass { //for very complicated math!!!
    public:
        static dll_API double Add(double a, double b);
        static dll_API double Subtract(double a, double b);
        static dll_API double Multiply(double a, double b);
    };
}

dll.cpp - the cpp file :)
#blablablabla include and such
namespace TutTest{
    double TutTest::Add(double a, double b){
        return a + b;
    }
    double TutTestClass::Subtract(double a, double b){ 
        return a - b;
    }
    double TutTest::TutTestClass::Multiply(double a, double b){
        return a * b;
    }
}

在上面的.cpp文件中,默认表示法(在教程中使用)是“double TutTest :: ...”,但是我玩了它并注意到“TutTestClass ::”和“TutTest ::” TutTestClass ::“似乎有效,因为IDE不会抛出任何错误/警告。

所以我想知道,3个符号是否意味着相同?他们相同吗? 如果是,除了个人编码风格之外,符号之间是否有任何区别? 或者这些符号在意义上是否有所不同?

2 个答案:

答案 0 :(得分:2)

TutTestClass::Subtract是正确的。 Subtract是类TutTestClass的(静态)成员函数,因此您必须相应地对其进行限定。

TutTest::TutTestClass::Multiply技术上是正确的,但很奇怪。在名称空间TutTest内,名称TutTestClass会自动引用TutTest::TutTestClass,因此明确限定该名称是多余的。

TutTest::Add不应该编译。这样做的目的是在命名空间Add中定义命名空间范围函数TutTest。但是,在

时,您只能使用限定名称来声明命名空间范围函数
  1. 该函数已在命名空间中声明,AND

  2. 声明在外部所涉及的命名空间中发生。

  3. 这些都不适用于您的情况。

答案 1 :(得分:1)

命名空间包含自身及其anchestores,因此TutTest::内的TutTest不执行任何操作。

但正因为如此,TutTest::AddTutTest::TutTestClass::Add不同。 (你实际上是在定义另一个从未声明过的函数)

namaspace TutTest { ... }内你可以避免TutTest::但是要在类baces之外定义类成员(即使是静态的),你需要用它所属的类来限定函数名。