What Are Member Functions
beginner
c++11
classes
In C++ a member function (also known as a method) is a function declared in a class’s scope.
Non-static member functions have access to all of a class’s public, protected, and private data as well as public and protected data from any base classes.
Non-static member functions also each have a special this
variable for referring to the object the member function was called on.
#include <iostream> #include <string> class Dog { public: // A member function called "set_name" void set_name(std::string name) { // Use `this` to make it clear we're assigning the name field // and not the name parameter this->name = std::move(name); } std::string name; }; int main() { Dog d; d.set_name("Doge"); std::cout << d.name << "\n"; }
Doge
In This Article
- Const - Read-only member functions
- Static - Class-scope member functions
- Virtual - Member functions that can be overridden in derived classes
- Abstract - Member functions with no implementation
- Final - Virtual member functions that cannot be overridden
Const Member Functions
Member functions that only read data but do not modify it can be marked const
.
Compilers will verify at compile-time that const
member functions do not modify internal data and will raise errors if they do.
#include <iostream> #include <string> class Dog { public: void set_name(std::string name) { this->name = std::move(name); } // get_name can be const because it does not modify name std::string get_name() const { return name; } private: std::string name; }; int main() { Dog d; d.set_name("Doge"); std::cout << d.get_name() << "\n"; }
Doge
Static Member Functions
Member functions can also be declared static
.
Static
member functions cannot access individual object’s data but they can access class static
data.
That is, static
in the context of classes in C++ means something is “class scope” instead of “object scope”.
Because the scope of static
member functions is the class level we use the class’s name to access static
member functions, much like a namespace.
#include <iostream> #include <string> class Dog { public: Dog() { dog_count++; } ~Dog() { dog_count--; } // A member function called "set_name" void set_name(std::string name) { // Use `this` to make it clear we're assigning the name field // and not the name parameter this->name = std::move(name); } std::string get_name() const { return name; } static int get_dog_count() { return dog_count; } private: std::string name; // Count how many dog objects are in the program. static int dog_count; }; // Static class data must be initialized out-of-line int Dog::dog_count = 0; int main() { Dog d; d.set_name("Doge"); std::cout << d.get_name() << "\n"; std::cout << Dog::get_dog_count() << " dog\n"; Dog dog2; d.set_name("Good Boyo"); std::cout << d.get_name() << "\n"; std::cout << Dog::get_dog_count() << " dogs\n"; }
Doge 1 dog Good Boyo 2 dogs
Virtual Member Functions
Virtual
member functions enable polymorphism in C++.
Virtual
member functions in base classes can be overridden in derived classes by using the override
keyword.
Virtual member functions can be const
just like regular member functions.
When a const
virtual
member function is overridden the override must also be const
.
#include <iostream> #include <string> class Animal { public: virtual int get_number_of_legs() const { return 0; } }; class Dog : public Animal { public: void set_name(std::string name) { this->name = std::move(name); } std::string get_name() const { return name; } int get_number_of_legs() const override { return 4; } private: std::string name; }; class Centipede : public Animal { public: int get_number_of_legs() const override { return 100; } }; int main() { Animal a; std::cout << a.get_number_of_legs() << "\n"; Dog d; d.set_name("Doge"); std::cout << d.get_name() << " has "; std::cout << d.get_number_of_legs() << " legs.\n"; Centipede c; std::cout << c.get_number_of_legs() << "\n"; }
0 Doge has 4 legs. 100
Abstract Member Functions
Abstract member functions are virtual
member functions without an implementation.
Any class with an abstract member function is called an “abstract class”.
To denote an abstract virtual
member function we use the = 0
syntax.
#include <iostream> #include <string> class Animal { public: virtual int get_number_of_legs() const = 0; }; class Dog : public Animal { public: void set_name(std::string name) { this->name = std::move(name); } std::string get_name() const { return name; } int get_number_of_legs() const override { return 4; } private: std::string name; }; class Centipede : public Animal { public: int get_number_of_legs() const override { return 100; } }; int main() { Dog d; d.set_name("Doge"); std::cout << d.get_name() << " has "; std::cout << d.get_number_of_legs() << " legs.\n"; Centipede c; std::cout << c.get_number_of_legs() << "\n"; }
Doge has 4 legs. 100
Final Member Functions
Final
member functions are virtual functions that are not allowed to be overridden by future derived classes.
Because final
can only be applied to virtual
functions that are being overridden you can omit the override
keyword.
#include <iostream> #include <string> class Animal { public: virtual int get_number_of_legs() const = 0; }; class Dog : public Animal { public: void set_name(std::string name) { this->name = std::move(name); } std::string get_name() const { return name; } int get_number_of_legs() const final { return 4; } private: std::string name; }; class Centipede : public Animal { public: int get_number_of_legs() const { return 100; } }; class StoneCentipede : public Centipede { public: int get_number_of_legs() const final { return 15; } }; int main() { Dog d; d.set_name("Doge"); std::cout << d.get_name() << " has "; std::cout << d.get_number_of_legs() << " legs.\n"; Centipede c; std::cout << "Centipedes have "; std::cout << c.get_number_of_legs() << " legs.\n"; StoneCentipede sc; std::cout << "Stone Centipedes have "; std::cout << sc.get_number_of_legs() << " legs.\n"; }
Doge has 4 legs. Centipedes have 100 legs. Stone Centipedes have 15 legs.