C++ 中的 :: 是啥意思? [复制]

Posted

技术标签:

【中文标题】C++ 中的 :: 是啥意思? [复制]【英文标题】:What does the :: mean in C++? [duplicate]C++ 中的 :: 是什么意思? [复制] 【发布时间】:2011-03-29 15:54:00 【问题描述】:
void weight_data::rev_seq(string &seq) 
//TODO
std::reverse(seq.begin(), seq.end());

在这个C++方法中,我觉得这个方法没有返回任何东西,所以前缀是void::告诉weight_datarev_seq(string &seq)之间的关系是什么?谢谢!

【问题讨论】:

:: 在 php 中被称为 Paamayim Nekudotayim。 【参考方案1】:

weight_data 是 namespace 或类名。

【讨论】:

【参考方案2】:

void 是返回类型。 :: 是作用域解析运算符,所以这意味着rev_seqweight_data 的作用域内。 weight_data 可以是命名空间或类(根据您提供的内容,无法确定是哪个)。

【讨论】:

"weight_data" 被定义为 a.hpp 文件中的一个结构,其中一个名为 "rev_seq" 的方法(未实现),然后在 a.cpp 文件中,这个方法被称为我在问题部分 @ladyfafa: void weight_data::rev_seq(string &seq) ... 那个成员函数的实现。 @sbi:好的,我明白了;可以多次实施吗?即在不同的 cpp 文件中,对来自结构“weight_data”的同一函数“rev_seq”进行不同的实现 @ladyfafa: 否——C++ 有一个“单一定义规则”(ODR),即任何一个函数只能实现(定义)一次。有几种例外情况(例如,对于内联函数),但它们只是一些例外情况,无论如何这都不适合其中任何一种。 @ladyfafa:通常,定义只能出现一次。 (参见What is the difference between a definition and a declaration?)但是,不同的成员函数可以在不同的实现文件中实现。此外,根据某些先决条件(例如,编译程序的平台),条件编译可用于包含同一实体的多个定义之一。【参考方案3】:

在 C++ 中,

A::B 表示Bnamespaceclass 类型A 中的标识符, A.B 表示Bstructclassunion 类型的成员,其实例由对象或引用A 引用,并且 A->B 表示Bstructclassunion 类型的成员,其实例由指针A 引用。 (相当于(*A).B。)

在其他一些语言中,所有这三种情况都只包含在 . 中。

请注意,在 C++ 中,成员函数不必在其类的定义中实现(定义)。 (如果是,则它们隐含为inline。)它们可以并且经常在单独的实现(.cpp)文件中实现。这样做的好处是,当您更改类的成员函数之一的实现时,并非类的所有用户都需要重新编译。因此,除非weight_datanamespace 名称,否则void weight_data::rev_seq(string &seq) ... 是其类之外的类成员的此类定义。

【讨论】:

非常全面,非常感谢! 注意:*-> 运算符可以重载。通常,它们仅对迭代器和智能指针之类的东西进行重载。设计不佳的代码可能会使这些运算符过载。 @Brian:这是一个非常好的观点!【参考方案4】:

void weight_data::rev_seq(string &seq) 行告诉编译器这是来自weight_datarev_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 让我注意到这一点。【参考方案5】:

刚刚想到添加 2 个关于 ::

的有趣的东西

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.

【讨论】:

以上是关于C++ 中的 :: 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

这个符号在 C++ 中是啥意思? [复制]

[=](...)... 在 C++ 中是啥意思? [复制]

-> 在 C++ 中是啥意思? [复制]

“= 0”在 C++ 中是啥意思? [复制]

C++,构造函数后的冒号是啥意思? [复制]

^ 在 Visual Studio C++ 中是啥意思? [复制]