void weight_data::rev_seq(string &seq){
//TODO
std::reverse(seq.begin(), seq.end());
}
在这个C++方法中,我认为这个方法不返回任何内容,所以前缀是void。双冒号<::>表示weight_data和rev_seq(string &seq)之间的关系是什么?谢谢!void
是返回类型。 ::
是范围限定符,它意味着 rev_seq
在 weight_data
的作用域内。根据您提供的信息,weight_data
可能是命名空间或类(无法确定)。
void weight_data ::rev_seq(string&seq){...}
是该成员函数的实现。 - sbiweight_data w; w.rev_seq(whatever);
- Jerry Coffin在C++中,
A::B
表示B
是A
命名空间或类类型内的标识符,A.B
表示B
是指向对象或引用A
所引用的struct
、class
或union
类型的成员,A->B
表示B
是指针A
所引用的struct
、class
或union
类型的成员。(它等同于(*A).B
)在一些其他语言中,以上三种情况都只使用.
。
请注意,在C++中,成员函数不必在其类的定义内实现(定义)。 (如果实现了,则隐式为inline
。)它们可以在单独的实现(.cpp
)文件中实现。这样做的好处是,当您更改类的一个成员函数的实现时,不需要重新编译所有使用该类的用户。因此,除非weight_data
是命名空间名称,否则void weight_data::rev_seq(string &seq) {...}
就是类成员在其类外部的这样一个定义。
*
和 ->
运算符可以被重载。通常它们仅被用于迭代器和智能指针等用途。有可能出现糟糕设计的代码会重载这些运算符。 - Brian代码行 void weight_data::rev_seq(string &seq)
告诉编译器这是来自 weight_data
类的 rev_seq(string &seq)
成员函数的定义。如果只写成 void rev_seq(string &seq) { ... }
,编译器会认为这是一个非成员函数的定义,而不是 weight_data
类的 rev_seq(string &seq)
成员函数。
class weight_data
{
void rev_str(string &seq);
}
这也可以意味着rev_str
是命名空间weight_data
中的一个函数。
namespace weight_data
{
void rev_str(string &seq);
}
weight_data
可能是一个命名空间。另外,我认为你的意思是写成“如果只是这样说 void rev_seq(string &seq) { ... }
...”。 - sbi刚想到有两件关于::有趣的事情:
a)运算符::既是一元运算符,也是二元运算符
struct A{
int m;
};
int x;
int main(){
::x; // Unary
int (A::*p) = &A::m; // Binary
}
b) $10.3/12 - "使用作用域解析运算符(5.1)显式限定可以抑制虚函数调用机制。"
struct A{
virtual void f(){cout << 1;}
};
struct B : A{
void f(){cout << 2;}
};
int x;
int main(){
B b;
A &ra = b;
ra.f(); // dynamic binding, prints 2
ra.A::f(); // suppress VF mechanism, prints 1.
}