我试图理解这里列出的C ++程序。我对第86-87行中双冒号的第二次使用感到困惑:
using TransformType = itk::AffineTransform< ScalarType, Dimension >;
TransformType::Pointer transform = TransformType::New();
Run Code Online (Sandbox Code Playgroud)
看起来TransformType是用户定义的类型。以前如何使用它New()?我听说要在名称空间后使用双冒号,但是在这里,TransformType是类型(即类)而不是名称空间。有人可以澄清---是否应在C ++中的命名空间之后始终使用双冒号?是否可以使用点(例如Java)代替?
您可以使用作用域解析运算符(::)在名称空间,类,作用域枚举中命名;这称为合格查找。
#include <iostream>
namespace N
{
int x = 0;
}
int main()
{
std::cout << N::x << '\n';
}
Run Code Online (Sandbox Code Playgroud)
与类一起使用它通常意味着您要引用某个static成员,因为否则通常会使用它objectInstance.member。
#include <iostream>
class C
{
public:
static int x;
}
int C::x = 0;
int main()
{
std::cout << C::x << '\n';
}
Run Code Online (Sandbox Code Playgroud)
不过,在非静态成员函数中,仍然有for的用法::,例如消除同时存在于不同基础中的名称之间的歧义。
class Base
{
public:
void foo() {}
};
class Derived : public Base
{
public:
void foo()
{
// Do base version (omitting Base:: will just call this one again!)
Base::foo();
// Now maybe do other things too
}
};
int main()
{
Derived obj;
obj.foo();
}
Run Code Online (Sandbox Code Playgroud)
…或用于static在不需要对象上下文的情况下命名非成员:
#include <iostream>
class C
{
public:
int x;
}
int main()
{
std::cout << sizeof(C::x) << '\n';
decltype(C::x) y = 42;
}
Run Code Online (Sandbox Code Playgroud)
范围枚举是必需的,因为它们是范围限定的。这就是他们的重点。它们不会泄漏到周围的范围内,但是具有自己的范围,因此您需要特别指定。
enum class E
{
Alpha,
Bravo,
Charlie
};
void foo(E value) {}
int main()
{
foo(E::Alpha);
}
Run Code Online (Sandbox Code Playgroud)
某些语言允许您访问static类型名称后跟的类的成员.,就像您访问static对象名称后跟的类的非成员一样.。C ++不是这些语言之一。
顺便说一句,这是合法的:
#include <iostream>
class C
{
public:
int x = 42;
};
int main()
{
C obj;
std::cout << obj.C::x << '\n';
// ^^^ what?!
}
Run Code Online (Sandbox Code Playgroud)
x无需在此处添加范围解析,因为该语言已经从中obj.得知您正在请求类的成员C。但是您仍然可以根据需要添加它。在这种情况下,通常只是“为您完成”。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |