The double colon ( :: ) may refer to: an analogy symbolism operator, in logic and mathematics. a notation for equality of ratios. a scope resolution operator, in computer programming languages.
An Arrow operator in C/C++ allows to access elements in Structures and Unions. It is used with a pointer variable pointing to a structure or union. The arrow operator is formed by using a minus sign, followed by the greater than symbol as shown below.
The Scope Resolution Operator (also called Paamayim Nekudotayim) or in simpler terms, the double colon, is a token that allows access to static, constant, and overridden properties or methods of a class. When referencing these items from outside the class definition, use the name of the class.
You can use a colon to connect two sentences when the second sentence summarizes, sharpens, or explains the first. Both sentences should be complete, and their content should be very closely related. Note that if you use colons this way too often, it can break up the flow of your writing.
The three distinct operators C++ uses to access the members of a class or class object, namely the double colon ::
, the dot .
, and the arrow ->
, are used for three different scenarios that are always well-defined. Knowing this allows you to immediately know quite a lot about a
and b
just by looking at a::b
, a.b
, or a->b
, respectively, in any code you look at.
a::b
is only used if b
is a member of the class (or namespace) a
. That is, in this case a
will always be the name of a class (or namespace).
a.b
is only used if b
is a member of the object (or reference to an object) a
. So for a.b
, a
will always be an actual object (or a reference to an object) of a class.
a->b
is, originally, a shorthand notation for (*a).b
. However, ->
is the only of the member access operators that can be overloaded, so if a
is an object of a class that overloads operator->
(common such types are smart pointers and iterators), then the meaning is whatever the class designer implemented. To conclude: With a->b
, if a
is a pointer, b
will be a member of the object the pointer a
refers to. If, however, a
is an object of a class that overloads this operator, then the overloaded operator function operator->()
gets invoked.
The small print:
class
, struct
, or union
are considered "of class type". So the above refers to all three of them.T*&
) are rarely ever used.Suggesting an alternative for sbi's point 3
a->b
is only used if a
is a pointer. It is a shorthand for (*a).b
, the b
member of the object that a
points to. C++ has two kinds of pointers, "regular" and smart pointers. For regular pointers such as A* a
, the compiler implements ->
. For smart pointers such as std::shared_ptr<A> a
, ->
is a member function of class shared_ptr
.
Rationale: the target audience of this FAQ isn't writing smart pointers. They don't need to know ->
is really called operator->()
, or that it is the only member access method that can be overloaded.
Dot operator is used in direct member selection scenarios.
print(a.b)
Here, we are accessing b
, which is a direct member of an object a
. So, primarily, a
is an object and b
is a member (function/ variable etc) of a
.
Arrow operator is used in indirect member selection scenarios.
print(a->b)
Here, we are accessing b
which is a member of the object, that is pointed to by a
. It is shorthand of (*a).b
and so here, a
is primarily a pointer to an object and b
is a member of that object.
Double Colon (Scope) operator is used in namespace related direct member selection scenarios.
print(a::b)
Here, we are accessing b
which is a member of the class/namespace a
.So, primarily, a
is a class/namespace and b
is a member (function/ variable etc) of a
.
#include <iostream>
#include <string>
using namespace std;
class Human {
private:
int age;
public:
string name;
Human(int humanAge, string humanName)
: age(humanAge), name(std::move(humanName)) {}
void DoSomething() {
cout << age << endl;
}
static void DisplayAge(const Human& person) {
cout << person.age << endl;
}
// ...
};
int main() {
// Usage of Dot(.)
Human firstMan(13, "Jim"); // firstMan is an instance of class Human
cout << firstMan.name << endl; // accessing member attributes
firstMan.DoSomething(); // accessing member functions
// Usage of Pointer Operator (->)
Human* secondMan = new Human(24, "Tom");
cout << secondMan->name << endl; // accessing member attributes
secondMan->DoSomething(); // accessing member functions
cout << (*secondMan).name << endl; // accessing member attributes
(*secondMan).DoSomething(); // accessing member functions
// Usage of Double Colon (::)
Human::DisplayAge(firstMan);
firstMan.DisplayAge(firstMan); // ok but not recommended
secondMan->DisplayAge(firstMan); // ok but not recommended
delete(secondMan);
return 0;
}
From the coding example above, we see that:
* Accessing members(attributes and functions) from an instance(or object) using the dot operator (.
)
* Accessing members(attributes and functions) from a pointer to an object(or created by new
) using the pointer operator (->
)
* Accessing static member functions from class itself without having an object as a handle using the double colon (::
). [Note: you can also invoke the static member function from a instance with .
or ->
which is not recommended]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With