

C++ Overview


by John Tal



1.0.C++ and C


C++ is an object-oriented extension to the C language.  C++ can be

used to compile C programs.  Everything you can do in C, you can also

do in C++.  C++ programs and their extensions cannot be compiled under 

a C only compiler.


2.0.Object-Oriented Programming


2.1.Class


The class concept is the fundamental building block for all

objected-oriented programming systems (OOPS).  A class consists of an

object (or group of objects) and the function(s) which operate on the

obects(s).  In C++, a class is defined in a similar way to a

structure, except the keyword class is used:


..class FILE_C;     // forward reference to a class



2.2.Class Components


A class definition contains declarations for variables and functions. 

A class definition also provides different security areas for

variables and functions.


..class FILE_C

..{

..  private:

..  .long.ptr;..  // file pointer

...char.name[FNAME_LEN];  // file name

...short.state;..  // file state

...short.mode;..  // file mode

..  public:

...FILE_C(void);..// class constructor

...~FILE_C(void);.        // class destructor

...short.Open(char *,short);  // open function

.      ..short.Close(void);.     // close function

...short.Read(char *,short);  // read function

...short.Write(char *,short); // write function

..};


The above FILE_C class has four private data items (objects) and six

functions which operate on those objects.  Any access to the class

objects must occur through a class function.  The private keyword

enforces this data hiding by preventing the application using the

class from having access to anything in the class private area.  Only

the class functions themselves can access private objects.


2.3.Class Constructors And Destructors


The FILE_C class has a FILE_C() function as a constructor and a

~FILE_C() function as a destructor.  The constructor is a function

with the same name as the class which is invoked at the creation of

an instance of the class and is intended to provide any

initialization the class requires.   The destructor function also 

has the same name as the class but with a '~' (tilde) character in 

front of it.  A destructor is provided for any cleanup work to occur 

within the class at the termination of the class instance (such as 

making sure the file is closed).


A class instance is created in two different ways.  The first is by

declaring a class instance in the same way a standard C language

variable is created.


.short.x;         //  create a variable named x

.FILE_C  LogFile;   // create a unique instance of the FILE_C class



The second method of creating a class instance is by allocating a new

instance through a pointer and the new keyword.


.FILE_C * pLogFile;.// create a pointer to a FILE_C class


.pLogFile = new FILE_C;.// create an instance and assign ptr


The new keyword is provided as an improved calloc or malloc.  The new

keyword calculates the size of the memory block to be allocated to

the item being created.


2.3.1.Constructors With Parameters


Like any function, a constructor can take parameters.   The

parameters would be supplied at the time of the creation of a new

class instance.


.class FILE_C

.{

.....

.  public:

..FILE_C(char *pFileName);

.};


.FILE_C.LogFile("LogFileName");  // constructor with parm



2.4.Class Function Calling


Class member functions are called like normal C functions.  The

difference is that they use syntax similar to that used for structure

membership.


.

.FILE_C.LogFile;.// create instance of FILE_C

.FILE_C * pInputFile;.// create ptr to instance of FILE_C


.pInputFile = new FILE_C;   // create instance of FILE_C


.LogFile.Open("LogFile",O_APPEND);    // open LogFile


.InputFile -> Open("InputDat",O_READONLY);  // open InputFile


.InputFile -> Read(buffer,sizeof(buffer));  // read InputFile



From the above example, a file pointer is never sent to the FILE_C

functions as would be in standard C file functions.  This is because

each instance of the FILE_C maintains its own control information

internal to the class itself in its own private area.  C++ usually

simplifies interfaces between classes and applications because

classes are complete in themselves.  They contain all the attributes

and/or objects that describe the class within.



2.5.Class Function Declaration


A class definition (such as class FILE_C ...) would occur in an 

include file.  The actual functions of the class would be declared in

a C++ source file.   Each class function is prefixed with the class

name to which it belongs and the symbol '::'.


.short FILE_C::Open(char * pFileName,short mode)

.{

..mode = mode;   // referencing private data item


..strcpy(name,pFileName);


..//  perform open


. .return (status);

.}



2.6.Inline Functions


If a class function is performing a very simple task, it can be

declared an an inline function.  An inline function is an expanded

version of the function declaration within the class with begin and

end braces surronding the inline statement(s).


.class FILE_C

.{

.  private:

.    char.name[FNAME_LEN];  // file name

.....

.  public:

.     FILE_C(char *pFileName) { strcpy(name,pFileName); }

.....

.};



The above example shows the FILE_C constructor implemented as an

inline function.  Inline functions should be limited to functions

having only a few (preferrably one) statement(s).



3.0.Derived Classes


One of C++' most powerful features is to use classes as building

blocks in creating entirely new classes.


.class BROWSE_C : FILE_C   // browse derived from file

.{.      

.  private:

.    short  curline;

.    ...

.  public:

.    BROWSE_C(void);

.    ~BROWSE_C(void);

.    OpenFile(char *);

.};



From the above example, the BROWSE_C class will have access not only

to all of its own member data/objects, but also to all FILE_C class

member functions which were declared as public or protected in

FILE_C.  The following table breaks down class security areas for

immediate classes and derived classes.



.Immediate..Derived

.----------..---------

.Private...Not-visible in derived class

.Protected..Visible as Private in derived

.Public...Visible as Protected in derived


From the above example, the BROWSE_C class would be able to access

any data and functions which were defined as protected or public in

the FILE_C class.  The application would not be able to access any of

the data or functions of the FILE_C class without going through a

public member function of the BROWSE_C class.   These are the default

security inheritance protocols for classes.


3.1.Customizing Class Inheritance


The default security inheritance can be overridden when defining

the derived class:


.class BROWSE_C : public FILE_C   // browse derived from file

.{.      

.  private:

.    short  curline;

.    ...

.  public:

.    BROWSE_C(void);

.    ~BROWSE_C(void);

.    OpenFile(char *);

.                       

.};


From the above example, all public functions of FILE_C class are also

public to applications using the BROWSE_C class.

.

3.2.Container Classes


Container classes are classes which contain other classes.  An example

would be a class to implement a binary tree:


.class TREE_C

.{


.   private:

 

.    struct TNODE_S. // the contained class

.    {

.      PVOID          pvData;

.      struct TNODE_S *pstLeft;

.      struct TNODE_S *pstRight;

.    };

.    typedef struct TNODE_S TNODE_T;

.    typedef TNODE_T *TNODE_P;

.    typedef TNODE_T **TNODE_PP;

. 

.    TNODE_P  pstHead;

.    TNODE_P  pstNode;

.....

.

.public:

.

.    TREE_C(VOID);

.    ~TREE_C(VOID);

.    SHORT    Delete(PVOID);          // Remove entry

.    SHORT    Find(PVOID,PPVOID);     // Find entry

.    SHORT    Insert(PVOID);          // Insert entry

.....

.};

.

.typedef TREE_C * TREE_CP;

.typedef TREE_C ** TREE_CPP;


In the binary tree example, it was not desirable for each node of the

tree to be an instance of the TREE_C class.  So each node is

contained in the TREE_C class and the TREE_C class operates on all

the TNODE_S structures/classes contained within it.


3.3.Virtual Functions


Virtual functions provide a way for a base class function to take on

the characteristics or behavior appropriate to the current derived

class.


.class FILE_C

.{

.  private:

.    char.name[FNAME_LEN];  // file name

.....

.  public:

.     FILE_C(char *pFileName) { strcpy(name,pFileName); }

.     virtual short Reset(void);  

.};


.class BROWSE_C : FILE_C   // browse derived from file

.{.      

.  private:

.    short  curline;

.    ...

.  public:

.    BROWSE_C(void);

.    ~BROWSE_C(void);

.    OpenFile(char *);

.    short Reset(void);

.};


.short BROWSE_C::Reset(void)

.{

.    FILE_C::Reset();

.    curline = 0;

        }





4.0.Operator Overloading


Since C++ classes define in detail the characters of and operations

upon the class instance, C++ allows all standard operators (i.e. '+',

'-', '*', '/', '++', '--') to be redefined or overloaded for the

current class.


.class STRING_C

.{

.   private:

.     char * pChar;

.     int  len;

.....

.   public:

.     STRING_C(const char * = 0);  // provide default value

.    ~STRING_C(delete pChar);

.     void operator+(char *)

      .};


.STRING_C::operator+(char *pC)

.{

.   char * pBuf;

.   pBuf = new char[len=strlen(pC)+len];

           strcpy(pBuf,pChar);

.   strcat(pBuf,pC);

       .   delete pChar;

.   pChar = pBuf;

.}



.STRING_C  Str("ABC");


.Str + "DEF";.   // internal pChar now = 'ABCDEF'


.

Operator overloading still involves functions to simulate the

operator being overloaded.  Overloading simply provides a mechanism

for abbreviating the operations.



5.0.C++ Input/Output


C++ output is simplified over that of C printf family functions.  C++

defines the keywords cout and cin and the stdout and stdin devices. 

C++ automatically formats the output based on the current variable

type.



./*  In C */


.printf("%s = %d\n", szRate, sRate);


.//  In C++


.cout << szRate << " = " << sRate << "\n";



.//  Another C++ alternative


.cout << form("%s = %d\n", szRate,sRate);



./*  In C */


.scanf("%d",&sRate);


.//  In C++


.cin >> sRate;



7.0.Reference Variables


C++ provides a syntax which allows programmers who are not

comfortable with C pointer syntax to more easily write applications

which use pointers.



./*   In C */


.short Afunc(short * psShort)

.{

.   *psShort++;

.}



.//   In C++


.short Afunc(short & Short)

.{

.   Short++;

.}


