I know Class *cls is a pointer, and Class &cls takes the address, but what is
void fucction1( Class *&cls)
If I have Class c
Besides, what James explained in his response, let me add one more important point to it.
While you can write Class* &
(reference to pointer) which is perfectly valid in C++ only, you cannot write Class& *
(pointer to reference), as you cannot have a pointer to a reference to any type. In C++, pointer to reference is illegal.
§8.3.2/4 from the language specification reads,
There shall be no references to references, no arrays of references, and no pointers to references.
If I have Class c, what should I pass to function1()?
You can write your calling code like this:
Class *ptrClass;
//your code; may be you want to initialize ptrClass;
function1(ptrClass);
//if you change the value of the pointer (i.e ptrClass) in function1(),
//that value will be reflected here!
//your code
For a type T
, T*
is a pointer to an object of type T
, so Class*
is a pointer to a Class
object.
For a type T
, T&
is a reference to an object of type T
, so putting them together, Class*&
is a reference to a pointer to a Class
object.
As said, a reference to a pointer to Class.
Class *
to the functionThis is a rather uncommon interface, you need more details to know what pointers are expected, and what you have to do with them.
Two examples:
Iteration
bool GetNext(Classs *& class)
{
if (class == 0)
{
class = someList.GetFirstObject();
return true;
}
class = somePool.GetObjectAbove(class); // get next
return class != 0;
}
// Use for oterating through items:
Class * value = 0;
while (GetNext(value))
Handle(value);
Something completely different
void function (Class *& obj)
{
if (IsFullMoon())
{
delete obj;
obj = new Class(GetMoonPos());
}
}
In that case, the pointer you pass must be new-allocated, and the pointer you receive you need to pass either to function
again, or be delete
'd by you.
Class c;
Class* c_ptr = &c;
function1(c_ptr);
Would work. But note that rvalue-references is only possible with C++0x which most compilers haven't fully implemented them. Thus the following wouldn't work:
Class c;
function1(&c);