C++中的::代表什么意思?

13
void weight_data::rev_seq(string &seq){ 
//TODO
std::reverse(seq.begin(), seq.end());
}
在这个C++方法中,我认为这个方法不返回任何内容,所以前缀是void。双冒号<::>表示weight_data和rev_seq(string &seq)之间的关系是什么?谢谢!

在PHP中,::被称为Paamayim Nekudotayim。 - Eugene Yokota
5个回答

25

void 是返回类型。 :: 是范围限定符,它意味着 rev_seqweight_data 的作用域内。根据您提供的信息,weight_data 可能是命名空间或类(无法确定)。


2
@ladyfafa:void weight_data ::rev_seq(string&seq){...}是该成员函数的实现。 - sbi
@ladyfafa:不行——C++有一个“一个定义规则”(ODR),它指出任何一个函数只能被实现(定义)一次。有一些特殊情况(例如内联函数),但它们只是某种程度上的例外,而且这个情况不符合任何一种特殊情况。 - Jerry Coffin
正如@sbi所指出的那样,Java接口有点像一个只能声明虚拟函数而不能声明任何数据(例如)或实现任何函数的类。在这种情况下,“implements”是更抽象的。 - Jerry Coffin
@ladyfafa:除非它是一个静态函数,否则你必须将其作为对象的成员调用,例如:weight_data w; w.rev_seq(whatever); - Jerry Coffin
"std::reverse(seq.begin(), seq.end());" 会将字符串 "seq" 反转,对吗? - ladyfafa
显示剩余12条评论

15

在C++中,

  • A::B表示BA命名空间或类类型内的标识符,
  • A.B表示B是指向对象或引用A所引用的structclassunion类型的成员,
  • A->B表示B是指针A所引用的structclassunion类型的成员。(它等同于(*A).B

在一些其他语言中,以上三种情况都只使用.

请注意,在C++中,成员函数不必在其类的定义内实现(定义)。 (如果实现了,则隐式为inline。)它们可以在单独的实现(.cpp)文件中实现。这样做的好处是,当您更改类的一个成员函数的实现时,不需要重新编译所有使用该类的用户。因此,除非weight_data是命名空间名称,否则void weight_data::rev_seq(string &seq) {...}就是类成员在其类外部的这样一个定义。


1
非常全面,非常感谢! - ladyfafa
2
注意:*-> 运算符可以被重载。通常它们仅被用于迭代器和智能指针等用途。有可能出现糟糕设计的代码会重载这些运算符。 - Brian
@Brian:这是一个非常好的观点! - sbi

2
"weight_data" 是一个命名空间或类名。

0

代码行 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);
}

1
请注意weight_data可能是一个命名空间。另外,我认为你的意思是写成“如果只是这样说 void rev_seq(string &seq) { ... }...”。 - sbi
感谢sbi提醒我注意到这个问题。 - josh

0

刚想到有两件关于::有趣的事情:

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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接