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_data
和rev_seq(string &seq)
之间的关系是什么?谢谢!
【问题讨论】:
:: 在 php 中被称为 Paamayim Nekudotayim。 【参考方案1】:weight_data
是 namespace 或类名。
【讨论】:
【参考方案2】:void
是返回类型。 ::
是作用域解析运算符,所以这意味着rev_seq
在weight_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
表示B
是namespace
或class
类型A
中的标识符,
A.B
表示B
是struct
、class
或union
类型的成员,其实例由对象或引用A
引用,并且
A->B
表示B
是struct
、class
或union
类型的成员,其实例由指针A
引用。 (相当于(*A).B
。)
在其他一些语言中,所有这三种情况都只包含在 .
中。
请注意,在 C++ 中,成员函数不必在其类的定义中实现(定义)。 (如果是,则它们隐含为inline
。)它们可以并且经常在单独的实现(.cpp
)文件中实现。这样做的好处是,当您更改类的成员函数之一的实现时,并非类的所有用户都需要重新编译。因此,除非weight_data
是namespace
名称,否则void weight_data::rev_seq(string &seq) ...
是其类之外的类成员的此类定义。
【讨论】:
非常全面,非常感谢! 注意:*
和 ->
运算符可以重载。通常,它们仅对迭代器和智能指针之类的东西进行重载。设计不佳的代码可能会使这些运算符过载。
@Brian:这是一个非常好的观点!【参考方案4】:
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 让我注意到这一点。【参考方案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++ 中的 :: 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章