Pointer To An Object In C++ - C++ Programming Tutorial
C++ Course / Pointers & References / Pointer To An Object In C++

Pointer To An Object In C++

BLUF: Mastering Pointer To An Object In C++ is a critical step in becoming a proficient C++ developer. This lesson provides a deep dive into the syntax, performance considerations, and real-world applications of this concept.
Key Performance Insight: Pointer To An Object In C++

C++ is renowned for its efficiency. Learn how Pointer To An Object In C++ enables low-level control and high-performance computing in the tutorial below.

Pointers in C++ enable us to access and modify class objects by utilizing their memory addresses. This functionality is crucial for tasks like dynamic memory allocation, efficient object passing to functions, incorporating polymorphism, as well as managing data structures like linked lists and trees.

A reference to an object in C++ is a variable that stores the memory location of an object. Pointers offer an indirect means to manage memory entities. They prove to be quite useful in scenarios where dynamic allocation of memory for objects is required, constructing linked structures like lists or trees, or transferring objects by reference to functions without creating copies.

The functionality of an object in C++ is akin to that of a pointer to a variable. However, in this scenario, the memory address of the object is stored rather than that of the variable. When an instance of a class is created within the main function, a pointer variable is declared in a similar manner to a regular variable. It is advisable not to specify a data type for the pointer when creating a pointer to an object. Instead, the name of the class of the object should be used for the pointer declaration. To access a member function of a class using a pointer within the main function, the -> symbol needs to be employed.

Declaring a Pointer to an Object

We define a pointer to an object by specifying the name of the object's class, then adding an asterisk (*) and the name of the pointer.

Example

ClassName *pointer name; // Declaration of a pointer to an object

Creating Objects and Pointers

Objects are instantiated by utilizing the new keyword, which dynamically reserves memory for the object. Subsequently, the Pointer is set to hold the memory address of the freshly generated object.

Example

ClassName *objPtr = new ClassName(); // Creating an object and assigning its address to the pointer

Accessing Object Members via Pointer

We have the option to utilize the arrow operator (->) to retrieve members (variables and functions) of the object via the pointer.

Example

objects->memberFunction(); // Calling a member function through the pointer

int value = objPtr->memberVariable; // Accessing a member variable through the pointer

Dereferencing a Pointer

We "dereference" a pointer by utilizing the asterisk (*) operator to retrieve the actual object instead of its attributes.

Example

ClassNameobj = *objPtr; // Dereferencing the pointer to get the object

Deleting Objects and Pointers

When we have finished working with the dynamically allocated object, it is crucial to release the memory by using the delete keyword.

Example

Delete objects; // Deleting the dynamically allocated object.

Null Pointers

Pointers can also store a unique value, nullptr, to signify that they are not pointing to a valid memory address.

Example

ClassName *nullPtr = nullptr; // Initializing a pointer with a null value

Passing Pointers to Functions

In C++, pointers are commonly employed to pass objects by reference to functions, enabling the function to make changes to the original object.

Example

void modifyObject(ClassName *ptr) {  

ptr->memberVariable = newValue;  

}  

modifyObject(objPtr); // Passing the pointer to the function

Pointer Arithmetic

Pointer arithmetic is typically used with pointers to arrays rather than with pointers to individual objects.

Example

int arr[5];  

int *ptr = arr;  

int third element = *(ptr + 2); // Accessing the third element using pointer arithmetic

C++ Pointer to an Object Example

Let's consider an example to grasp the concept of referencing an object in C++.

Example

Example

#include <iostream>  

using namespace std;   //using standard namespace

class MyClass {  

public:  

    int data;  

    // Constructor

    MyClass(int value) : data(value) {}  

    // Display function

    void display() {  

        cout << "Data: " << data << endl;  

    }  

};  

// Function to modify the object's data using a pointer  

void modifyObject(MyClass *ptr, int newValue) {  

    ptr->data = newValue;  

}  

int main() {    //main function

    // Creating an object and a pointer to the object  

    MyClass *objPtr = new MyClass(42);  

    // Accessing object's member through the pointer  

    objPtr->display();

    // Dereferencing the pointer to access the object directly

    MyClass obj = *objPtr;  

    obj.display();

    // Modifying object's member through the pointer  

    modifyObject(objPtr, 99);  

    objPtr->display();

    // Deleting the dynamically allocated object  

    delete objPtr;  

    // Creating an array of pointers to objects  

    MyClass *objArray[3];  

    for (int i = 0; i < 3; ++i) {  

        objArray[i] = new MyClass(i * 10);  

    }  

    // Accessing objects in the array of pointers  

    for (int i = 0; i < 3; ++i) {  

        objArray[i]->display(); 

    }  

    // Deleting dynamically allocated objects from the array  

    for (int i = 0; i < 3; ++i) {  

        delete objArray[i];  

    }  

    return 0;  

}

Output:

Output

Data: 42

Data: 42

Data: 99

Data: 0

Data: 10

Data: 20

Explanation:

In this illustration, we showcase the usage of object pointers, allocation of memory dynamically, and altering objects through pointers. Following this, a class named MyClass is established containing a constructor and a display function. Subsequently, an object is created dynamically through a pointer, accessed, and adjusted by dereferencing as well as by a distinct function.

An Array of Pointers to Objects

In C++, a collection of object pointers can be formed using an array, providing an efficient way to handle numerous objects. In C++, arrays enable element retrieval through indices, granting convenient access to a set of interconnected information. These elements are commonly situated in adjacent memory locations. Arrays have the capability to contain fundamental data types like integers, floating-point numbers, double-precision numbers, and characters, along with references to more intricate objects.

Syntax

It has the following syntax:

Example

Classname *obj_name[n]; // Array of pointers to 'Classname' objects

C++ Array of Pointers to Objects Example

Let's consider an instance to demonstrate an array of object pointers in the C++ programming language.

Example

Example

#include <iostream>

using namespace std;  //using standard namespace

class Book {

public:

    string title;

    void display() {

        cout << "Title: " << title << endl;

    }

};

int main() {    //main function

    Book* books[2];

    for (int i = 0; i < 2; ++i) {

        books[i] = new Book;

        books[i]->title = "Book " + to_string(i + 1);

    }

    for (int i = 0; i < 2; ++i) {

        books[i]->display();

        delete books[i];  // Free memory

    }

    return 0;

}

Output:

Output

Title: Book 1

Title: Book 2

Explanation:

In this instance, we dynamically instantiate two Book instances, set titles for each through iteration, and exhibit their titles via a method. Ultimately, it deallocates the assigned memory using delete to avoid memory leaks.

Dynamic Memory Allocation for Objects

In C++, object dynamic memory allocation proves beneficial when the quantity of objects is unknown during compilation. C++ employs the new operator to allocate memory for an object and yield a pointer to it.

C++ Dynamic Memory Allocation for Objects Example

Let's consider an example to demonstrate the process of allocating memory dynamically for objects in the C++ programming language.

Example

Example

#include <iostream>

using namespace std;  //using standard namespace

class Person {

public:

    string name;

    int age;

    void display() {

        cout << "Name: " << name << ", Age: " << age << endl;

    }

};

int main() {   //Main Function

    Person* p = new Person;

    p->name = "Alice";

    p->age = 25;

    p->display();

    delete p;  // Deallocate memory

    return 0;

}

Output:

Output

Name: Alice, Age: 25

Explanation

In this instance, a Person instance is dynamically generated via a pointer p. The object's memory is dynamically allocated during runtime with new, and its attributes (such as name and age) are initialized. Subsequently, the display method is invoked to showcase the information. Ultimately, the delete keyword is employed to release the allocated memory, thereby averting memory leaks.

Why is Dynamic Memory Allocation Helpful?

There are many scenarios in which dynamic allocation is needed.

  • When the set of objects can change at compile time.
  • To allow objects to be created at any time during a program's execution.
  • In setting up dynamic data structures such as linked lists, trees and graphs.
  • To reduce the memory used by the program and better manage when objects are created and destroyed.
  • It makes it easier to scale the application and use less memory.
  • Accessing Object Members Through Pointers

When employing dynamic memory allocation or pointers to reference objects, we can access the member variables using the pointer's identifier.

Example

Person* p = new Person;

p->name = "John";

p->age = 40;

p->display();  // Accessing function through pointer

Alternatively, it can be written as:

Example

(*p).name = "John";

(*p).display();

However, employing -> is favored for its simplicity and ease of understanding.

Base Class Pointers to Derived Class Objects

Polymorphism in C++ is achieved by employing a base class object to reference a derived class object. This enables the invocation of virtual functions through dynamic method dispatch.

C++ Base Class Pointers to Derived Class Objects Example

Let's consider an example to demonstrate the utilization of base class pointers with derived class objects in the C++ programming language.

Example

Example

#include <iostream>

using namespace std;  //using standard namespace

class Animal {

public:

    virtual void speak() {

        cout << "Animal speaks" << endl;

    }

};

class Dog: public Animal {

public:

    void speak() override {

        cout << "Dog barks" << endl;

    }

};

int main() {   //main function

    Animal* a;

    Dog d;

    a = &d;

    a->speak();  // Calls Dog's version due to virtual function

    return 0;

}

Output:

Output

Dog barks

Explanation:

In this instance, we've created a base class centered around animals, featuring a virtual speak method. Additionally, a subclass specifically for dogs has been implemented to redefine the speak method. Following this, within the main function, a pointer (a) of type Animal* is set to reference an instance of the derived Dog class (d).

Advantages of Pointer to Object in C++

Several advantages of a pointer to an object in C++ are as follows:

  • It supports dynamic memory allocation, which makes the use of memory easier and more efficient.
  • It supports runtime polymorphism, which helps set behaviour depending on what happens at the moment.
  • It supports making dynamic data structures, including linked lists, trees, and graphs.
  • It reduces the requirement to copy full objects when passing objects to functions.
  • It enables objects to be created on the heap, which keeps them alive for longer than the function.
  • Challenges of Pointer to an Object in C++

Several challenges of pointer to an object in C++ are as follows:

  • Even though pointers are powerful, using them improperly can cause mistakes.
  • Common pitfalls include:
  • Any dynamically allocated memory that goes unnoticed will eventually cause a memory leak.
  • If we delete an object and try to use the memory it occupies, we get a dangling pointer error.
  • Dereferencing, accessing, and null pointers can make a program crash at runtime.
  • Conclusion

In C++, an object pointer plays a crucial role in enabling dynamic functionality, optimizing memory usage, and enforcing object-oriented design concepts. It provides valuable capabilities like runtime polymorphism and dynamic object control. Nevertheless, using them requires careful management to avoid typical issues such as memory leaks and dangling pointers. Understanding how to effectively utilize object pointers can enhance the flexibility and efficiency of C++ applications.

C++ Pointer to an Object MCQs

1) What will occur if you allocate new memory for an object but never delete it?

  • The program leads to an immediate crash
  • At the end, the object is automatically removed.
  • A memory leak will occur
  • An object remains at rest in this case.

2) Which of the following is a common pitfall when using pointers to objects?

  • Using the delete keyword more than once for the same pointer
  • Applying the arrow operator
  • Employing dynamic memory
  • Selecting private members

a) Employing the delete keyword multiple times for a single pointer

3) What is the proper description of how a pointer to a base class is related to an object of a derived class?

  • It is not possible for a base class pointer to point at something of a derived class
  • A base class pointer can point to a derived class object and call only base class methods unless virtual functions are used
  • Normally, a base class pointer invokes functions defined in the derived classes.
  • You must convert a base pointer to a derived class using explicit casting.

4) Why do we usually assign a base class pointer to a derived class object in C++?

  • To decrease the amount of memory used
  • To ensure there is no need for virtual functions
  • To enable runtime polymorphism through virtual functions
  • Allow base class methods to be called only by derived classes

To facilitate runtime polymorphism by utilizing virtual functions.

5) Evaluate the provided code snippet to determine the resulting output.

Example

#include <iostream>

using namespace std;

class Demo {

public:

    void show() {

        cout << "Demo::show()" << endl;

    }

};

int main() {

    Demo* d = new Demo;

    d->show();

    delete d;

    return 0;

}
  • Compilation error
  • No output
  • Runtime error
  • Demo::show

Input Required

This code uses input(). Please provide values below:

Logic Practice
Install Logic Practice
Add to home screen for a faster app-like experience