C++';在类名后使用的双冒号,而不是命名空间 我试图理解一个C++程序。我对第86-87行第二次使用双冒号感到困惑: using TransformType = itk::AffineTransform< ScalarType, Dimension >; TransformType::Pointer transform = TransformType::New(); 使用TransformType=itk::仿射Transform; TransformType::Pointer transform=TransformType::New();
看起来C++';在类名后使用的双冒号,而不是命名空间 我试图理解一个C++程序。我对第86-87行第二次使用双冒号感到困惑: using TransformType = itk::AffineTransform< ScalarType, Dimension >; TransformType::Pointer transform = TransformType::New(); 使用TransformType=itk::仿射Transform; TransformType::Pointer transform=TransformType::New();,c++,syntax,C++,Syntax,看起来TransformType是用户定义的类型。在New()之前如何使用它?我听说双冒号将在名称空间之后使用,但在这里,TransformType是一个类型(即类),而不是名称空间。是否有人澄清——在C++中的命名空间之后,是否应该使用双冒号?可以改用点(如Java中的点)吗?您可以使用作用域解析运算符(:)来命名命名空间、类或作用域枚举中的内容;这就是所谓的 尽管如此,在非静态成员函数中,仍然有:的用法,例如消除同时存在于不同基中的名称之间的歧义 class Base { public:
TransformType
是用户定义的类型。在New()
之前如何使用它?我听说双冒号将在名称空间之后使用,但在这里,TransformType是一个类型(即类),而不是名称空间。是否有人澄清——在C++中的命名空间之后,是否应该使用双冒号?可以改用点(如Java中的点)吗?您可以使用作用域解析运算符(:
)来命名命名空间、类或作用域枚举中的内容;这就是所谓的
尽管如此,在非静态成员函数中,仍然有:
的用法,例如消除同时存在于不同基中的名称之间的歧义
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();
}
…或在不需要对象上下文的情况下命名非静态成员:
#include <iostream>
class C
{
public:
int x;
}
int main()
{
std::cout << sizeof(C::x) << '\n';
decltype(C::x) y = 42;
}
某些语言允许您访问类型名称后跟
的类的静态成员,就像您访问对象名称后跟
的类的非静态成员一样。C++不是其中的一种语言。
顺便说一下,这是合法的:
#include <iostream>
class C
{
public:
int x = 42;
};
int main()
{
C obj;
std::cout << obj.C::x << '\n';
// ^^^ what?!
}
#包括
C类
{
公众:
int x=42;
};
int main()
{
C obj;
std::cout如果类TransformType
具有静态成员函数New()
,则可以使用TransformType::New()调用它
::
是作用域解析运算符,它不限于名称空间。请参阅:运算符:
是作用域运算符,用于表示作用域。因此TransformType::New()
的意思是(基本上)“在TransformType
的范围内调用函数New
”@Someprogrammerdude谢谢。如果是这样的话,是否可以像在Java中一样使用“TransformType.New()”?我的意思是,使用点而不是两列?不,因为TransformType
是一个类型名。您不能将其用作对象实例(因为它不是)java和C++使用不同的语法和语义。它们是相似的出现的语言,但是它们是非常不同的。它们都是好的、成功的语言,它们的字符和原则不同。自从你提到了代码> Obj.C::X< /C>,你可能还想提到<代码> siZeof(C:X)< /C>或<代码> DECKType(C::X)。
用于非静态x
。
#include <iostream>
class C
{
public:
int x;
}
int main()
{
std::cout << sizeof(C::x) << '\n';
decltype(C::x) y = 42;
}
enum class E
{
Alpha,
Bravo,
Charlie
};
void foo(E value) {}
int main()
{
foo(E::Alpha);
}
#include <iostream>
class C
{
public:
int x = 42;
};
int main()
{
C obj;
std::cout << obj.C::x << '\n';
// ^^^ what?!
}