When we define some class in our C++ code, compiler is generating some important functions for our class (unless we define it explicitly).
Those functions (sometimes called Compiled Generated Functions) are:
During compilation, compiler knows our code and classes usage, so when we are using one of above functions implicitly, it generate that function implicitly for us in the class body.
For better explenation, let's see the example below:
In point (I) we are defining class TestClass. This class seems to be empty. However we are implicitly using following function in main class:
Because above functions are implicitly generated by compiler our class looks as in point II.
However if (for example) we remove line with point V, compiler will detect that we are not using copy assignment operator of TestClass in our code and will not generate that function for TestClass. So compiler generates only those Compiler Generated Functions which we are using in our code.
We can also explicitly switch off generating some of Compiled Generated Functions using default and delete C++11 keywords. It will be described in one of another articles.
Code of above example you can find on our GitHub repository here: https://github.com/xmementoit/CppAdventureExamples/tree/master/advancedCpp/compilerGeneratedFunctions
Those functions (sometimes called Compiled Generated Functions) are:
- default constructor
- destructor
- copy constructor
- copy assignment operator
During compilation, compiler knows our code and classes usage, so when we are using one of above functions implicitly, it generate that function implicitly for us in the class body.
For better explenation, let's see the example below:
In point (I) we are defining class TestClass. This class seems to be empty. However we are implicitly using following function in main class:
- point III - we are implicitly using defualt constructor in order to create instance of TestClass - default constructor of TestClass is implicitly generated by compiler
- point IV - we are using copy constructor of TestClass in order to copy instance to instance2 - copy constructor of TestClass is implicitly generated by compiler
- point V - we are using copy assignment operator of TestClass in order to copy instance2 to instance3 - copy assignment operator of TestClass is implicitly generated by compiler
- point VI - destructor of TestClass is implicitly being used - destructor of TestClass is implicitly generated by compiler
Because above functions are implicitly generated by compiler our class looks as in point II.
However if (for example) we remove line with point V, compiler will detect that we are not using copy assignment operator of TestClass in our code and will not generate that function for TestClass. So compiler generates only those Compiler Generated Functions which we are using in our code.
We can also explicitly switch off generating some of Compiled Generated Functions using default and delete C++11 keywords. It will be described in one of another articles.
Code of above example you can find on our GitHub repository here: https://github.com/xmementoit/CppAdventureExamples/tree/master/advancedCpp/compilerGeneratedFunctions
Just to make sure. If I use class TestClass following way:
ReplyDeletevoid main(){
TestClass instance;
TestClass instance 2 = instance;
}
Is compiler generating only default constructor, destructor in that situation (copy constructor and copy assignment operator are not generated)?
Yes, you are right. Compiler implicitly generates only those functions which it detects are used in the code. In your example those are: default constructor and destructor.
ReplyDelete