C++
What are containers in C++ and in Object Oriented Programming ? Which
objects are available as containers ?
A container is an
object that can store other objects as its elements. However all the objects
stored in a container should be of the
same data type.
E.g. array is a container as it allows you to store multiple objects. However
there are a few problems with arrays like
an array can’t
allow you to store an element anywhere in the middle of the array, an array
cannot grow dynamically to append new
elements at the
end of the array. A sequence container is the one which allows storing elements
of the same type in a linear fashion.
There are three
objects which are sequence containers: 1. Vector: an array like container that
allows storing elements of the same
type and provides
random access to these elements. Insertions and deletions at the end of the
vector are efficient.2. List: provides
efficient
insertions and deletions at any position within a list.3. dequeue: double ended
queue with constant time insertions and
deletions both at
the end and the beginning of the queue.
===================
Explain the Concept of Data Abstraction and Data Encapsulation in Object
Oriented Programming (OOPS)
Data
encapsulation: the wrapping up of data and functions that act upon that data in
a single unit is termed as data encapsulation. It
binds together
both the data and code and thus keeps both safe from the outside world. The
data and the code to manipulate the data
are combined in
such a way that a black box is created which is self contained and modular.
This box is termed as a class in object
oriented
terminology. Within a class the code or the data can be private or public. If
it is private then these cannot be accessed by the
outside world
whereas public means that the code and the data is accessible to everyone.
Typically the data is private and the
methods are an
interface to the private elements of the object. Data abstraction: The term
data abstraction is similar to data
encapsulation.
All the data and the methods that make sense to the objects of a class that is
been designed need to be a part of the
class. All
unnecessary details should be left behind. E.g. when designing a class to
represent a student we need data elements such
as student no,
student name, marks, grade, etc. If we now design a class representing a
cricket player we need details like no of
centuries,
striking rate, no of matches played, etc. It will not make sense to add the
player’s marks, grades which are applicable to a
student class to
this player class. The classes designed in object oriented language are also
termed as User defined data types
(UDT).
========================
What are classes ? How are they defined ?
A class in an
object oriented language is a User defined data type (UDT). A class is made up
of member variables (data) and
member functions
(interface).
A class is
created or declared using the class keyword. It defines a new type to represent
a real life entity. This type is composed of
data that is
private to the class and accessible through the public member functions of the
class.
As an analogy
consider a home. A home is like an object that has a state (whether lights are
on, number of walls, temperature, etc)
and it provides
services (like buttons to switch off the lights, a thermostat that controls the
temperature). This blueprint for a home is a
class since it
defines the characteristics of a group of such houses.
Syntactically a
class structure is similar to a structure except that everything in a class by
default is made private whereas everything
is public in a
structure by default.
E.g. class
student{ public: //public interface private://private implementation}
================================
What are objects ? What is common between all objects of a class ?
Objects are
physical or conceptual things that are found in the universe. Objects are
thought of having state associated with them.
E.g. state of an
account would be the account balance; the state of a clock would be the time.
In object
oriented terminology a class is just a plain structure and an object is an
instance of a structure. A class is a blueprint that
does not take
memory however when a class is instantiated by creating an object of that class
then each such object takes up
memory space.
All objects of a
class have identical structure however each object will have its own private
data. E.g. a class student will have multiple
instances of
students where each student instance will have distinct values for their
attributes.
Each object will
have its own memory with its data however all the objects of a class share the
member functions of a class.
E.g. we will
define a class called account and create two objects of this class.
class Account
{
private:
double
account_balance;
int account_no;
public:
double
calculateInterest();
void
deposit(double);
double
withdraw();
}
==============================
State all the class access modifiers and explain each one of them
C++ has three
access modifiers namely public, private and protected.
Public: a public
modifier means that the data or the functions of a class are accessible by any
program. There are no restrictions in
accessing public
members of a class. Ideally all the functions that allow manipulating or
accessing the class data are made public.
Private: the
private keyword means that the data and member functions that are private
cannot be accessed by other programs. They
are accessible
only within the class or struct in which they are declared. If one tries to
access the private members of a class it results
in a compile time
error. Encapsulation is possible due to the private access modifier.
Protected: this
access modifier plays a key role in inheritance. This keyword gives a protected
access to the member variables and
functions which
means that these are accessible from within the class as well as any classes
that are derived from the class that
declared this
member. However the protected members are not accessible to the any other
programs.
=====================
What are Vectors in C++(Object Oriented Programming) and how are they used
?
Vector is a part
of the sequential container which holds an ordered collection of elements of
one type. A vector holds all these
elements in a
contiguous area of memory. Random access of elements is efficient however
insertion of elements at any other position
other than the
end of the vector is inefficient since each element to the right of the element
to be inserted has to be shifted one by one
which leads to
inefficiency. Similarly deletion of an element besides the last element is
inefficient as well.
The vector is a
part of the std namespace and one must include #include header in order to use
a vector.
#include
using namespace
std;
int main()
{
vector v1;
v1.push_back(1);
v1.push_back(2);
}
The function
capacity () returns the total number of elements that the vector can hold and
size () returns the number of elements that
are currently
stored in the vector
=====================
What are Iterators in C++ and Object Oriented Programming ? Explain where
we use them
Iterators allow
the traversal of a container object. They provide a generic interface to
navigate a container without having to know the
actual type of
its elements. Several member functions of containers like begin () and end ()
return a pointer to iterators. Begin ()
returns a pointer
to the beginning of a container and end returns a pointer one position past the
last valid element of a container. This
element past the
last element marks the end of the container like a \0 is used to mark the end
of strings.
The functions
begin () and end () come in two flavors: const and non const. The non cons
version returns non const iterator that
enables a user to
modify the value of its container while const iterators cannot modify its
container.
e.g. vector v1;
vector ::iterator
p = v.begin ();
====================
What are the Algorithms namespace used for ?
Algorithms are an
important part of STL. These are generic algorithms that can be applied to
containers. The algorithms are divided
into three
categories:
1. Non-modifying
sequence operations: these algorithms do not directly modify the object they
work on. These are basically the
search
algorithms, checking for equality and counting. E.g. find () algorithm is used
to locate an element within a sequence.
2. Mutations
sequence operations: these algorithms modify the object that they operate on.
These are operations such as copy,
fill, replace and
transform. E.g. copy () algorithm is used to copy a sequence of objects to a
target object.
3. sorting
algorithms: these algorithms provide sorting and merging sequences and they
operate on sorted sequences. E.g. sort
(), partial_sort
(), binary_search (), etc.
==============================
What are Enumerations in C++ and Object Oriented Programming ? Explain with
an example ?
An enumeration is
a type that can hold a set of constant values that are defined by the user.
Once you define an enumeration you can
use it like
integer types.E.g. enum {OFF, ON};The enum defines two integer constants called
enumerators and these constants are
assigned values
by default. The value assigned to OFF = 0 and ON = 1. The above is an unnamed
enumeration, however an enum
can be named.
E.g. enum STATE {OFF, ON};Each enumeration is a distinct type and the type of
the enumeration is the enumerator.
For example OFF
is of type STATE. An enumerator can optionally be initialized by a constant
expression of integral type. E.g. enum
{WHITE = 3, BLACK
= 5}; A value of an integral type can be converter to an enumeration type. This
needs to be done explicitly. The
results are
undefined unless the value is within the range of the enumeration.E.g. enum
COLORS {RED = 1; BLUE = 3, WHITE =
7};COLORS c1 =
COLORS (5); All enumerators are converted to integral type for any arithmetic
operation.
==============================
What are References in C++ and OOPS ? How are they used ?
A reference means
an alias. It is an alternative name to an object. An object can have multiple
references. However the most
important use of
references is to pass arguments to function and return values for functions as
well as for overloaded operators. E.g.
consider a
reference for a variable x created as x1.int x = 10;int &x1 = x; To make
sure that the reference denotes an object it has to
be initialized.
Once initialized the value of a reference cannot be changed. In order to get a
pointer to the object denoted by the
reference x1 we
can write it as &x1; One of the important uses of reference is to pass an
object to a function as a reference so that
the function can
change the value of that object. e.g. void swap (int &a, int &b){ int
tmp = a; a = b; b = a;}void main (){ int x =
10, y = 12; swap
(x, y );} Since x and y are passed by reference to the function swap their
values get actually swapped.
============================
Explain the Rules for using Default Arguments with an example in C++.
A default
argument is used by functions to free the programmer from specifying values
which can be set to default by the function.
E.g. consider a
function for printing an integer. A user can be given an option to decide of
what base the integer should be printed
however in most
cases it will be decimal. E.g. void print (int value, int base = 10); //here
the base is set to 10 by defaultThe above
function can be
called as: print (10); //here default base will be taken as 10 print (10, 8); a
function can specify a default argument
for one or more
of its parameters at the initialization time within the parameter list. A
function that has a default parameter can be
invoked with or
without that parameter. If it gets invoked without the parameter then the
default value applies to that parameter.
Arguments to the
call are resolved by position and hence the default arguments can be specified
as trailing arguments only.e.g. void
display (int a,
int b = 0, int c = 9); // correct void display (int a = 0, int b, int c = 9);
//wrong void display (int a = 0, int b = 9, int c);
//wrong The
default arguments are specified in the function declaration and not in the
function definition.
==================================
What do you mean by “Pointers to Function”? What are Function Pointers ?
We can use a
function in two ways: one is to invoke a function and the second is to obtain
the address of a function. This address that
is obtained is
called as pointer to the function and is used to invoke the function.E.g. we
have a function named display and we will
invoke this
function using a pointer to this function as follow:void display (string s) /* …
*/void (*ptr)(string); //pointer to a function ptr =
&display;
//assign the address of the function ptr (“hello”); // call the function In the
above example the compiler will discover that ptr is
a pointer to the
function display and calls the function. The dereferencing of a pointer to a
function using a * is optional. Similarly it is
not necessary to
use & to get the address to the pointer. As pointers to functions have
argument types declared just like the functions
themselves,
therefore in pointer assignments the complete function type must exactly match.
A function name does not constitute its
type. A function
type is determined by its return type and its parameter list
======================
What are NameSpaces in C++ ? How do we use namespaces in C++ ?
The purpose of
namespaces is to reduce the name clashes that occur with multiple independently
developed libraries. It is used to
package names,
improve program readability and reduce the name clashes in the global
namespace.
e.g. namespace
mynamespace{ class Stack { }}The class Stack has to be referred as
mynamespace::Stack.
In this way
namespace facilitate building large systems by partitioning names into logical
groups. Java has a similar concept called
packages. One can
access the names within the namespace in the following ways: a. Use the scope
resolution operator to prefix
the object
declared in the namespace with the name of the namespace. e.g.
mynamespace::Stack *s = new
mynamespace::Stack
(); b. Using directive E.g. using namespace Stack; Stack *s = new Stack ();
===============
What is the Exception Handling mechanism in C++ ? What is Try and Catch in
C++ ?
The ability to
gracefully handle an error or an exception is known as exception handling. C++
has built exception handling techniques
which allows the
program to handle and exceptions and deal with them.
- try block: the
code that is likely to throw an exception should be enclosed in a try lock.
This allows the function to recover from
this exception.
If a code called from a try block cannot throw an exception then there is no
need for the try block.
- Catch block:
the exception that is thrown in the try block has to be caught in the catch
block. There can be multiple catch blocks
for a try block
however there cannot be any code between try and catch block. Once an exception
is caught and if the function can
recover from that
error then it can either continue normal processing or restart the try block by
putting the try block in a loop. If
required the
catch block can also propagate the exception to the calling function either by
throwing the same exception object or
throwing a
different exception object.
e.g.
try { File x
(filename); } catch (BadFileName& e) { cout << " second():
" << e.what() << ": Partial recovery\n"; throw; }
catch
(AccessViolation&
e) { cout << " second(): " << e.what() << ":
Full recovery\n"; }
* Login or
register to post comments
Re: What is the
Exception Handling mechanism in C++ ? What is Tr
Submitted by
Anonymous on Wed, 2007-07-11 16:19.
Exception
handling in C++ is complex and subtle. It is not as trivial as the above would
make you believe.
If you are
interested in learning, go and read Meyers, Sutter/GOTW et al.
For a proper
treatment, you need to discuss (at a bare minimum):
- What happens to
x when an exception is thrown.
- What happens if
the destructor of File throws.
- Why you want to
catch by reference.
- What can throw
(answer: a lot more than you think).
- RAII.
===================================
What is Operator Overloading in C++ ?
The ability to
overload operators is one of the most powerful features of C++. The operators
are overloaded so that they can perform
special
operations on the user defined classes. Say for example you create a class
representing complex number. We can overload
the + operator to
add two complex numbers. When an operator is overloaded it original meaning is
not lost in fact the type of objects
that the operator
can operate expands. Operators are overloaded by creating operator functions.
It is created using the keyword
operator. These
functions can either be member of a class or then they have to be friend
functions. Syntax: returntype classname::
operator#(arg-list)
{ } E.g. class Complex { private: float real; float imaginary; public: Complex
operator+ (Complex); };
//overloaded +
operator for class Complex Complex Complex::operator+ (Complex c) { Complex
tmp; tmp.real = this.real + c.real;
tmp.imaginary =
this.imaginary + c.imaginary; return temp; } The only C++ operators that cannot
be overloaded are dot (.), .*, ?:,
sizeof, typeid
and scope resolution operator (::).
========================
What are Friend Functions and Friend Classes in C++ ?
A friend can be a
function, another class or individual member function of a class. With the help
of a friend function it is possible to
grant a non
member function access to the private members of a class using a friend. A
friend function has all access to all the
private and
protected members of the class for which it is the friend. To declare a friend
function includes the function prototype within
the class
preceding it with the keyword friend. When a friend function is called it need
to be qualified by the object name as it is not a
member function
of the class. E.g. class Complex { private: float real; float imaginary;
public: friend Complex operator+ (Complex,
Complex);
};//overloaded + operator for class Complex Complex operator+ (Complex c,
Complex d) { Complex tmp; tmp.real = d.real
+ c.real;
tmp.imaginary = d.imaginary + c.imaginary; return temp; } To call the function:
int main (){ Complex a, b, c; a = b + c; //this
will be called as
operator+(b, c)} Friend classes are used when two or more classes are designed
to work together and need access
to each other’s
implementation. E.g. a class DataBaseCursor may want more privileges to the
class Database. E.g. class
DatabaseCursor;
class Database { //member variable and function declarations friend
DatabaseCursor; };
=============================
What are Constructors and Destructors in C++ ?
A constructor
constructs an object i.e. it initializes the objects internal data members as
well as it may allocate resource (memory,
files, sockets,
etc). The constructor has the same name as the class name and cannot have a return
type not even void. A constructor
can take multiple
arguments as its parameters. A class can have multiple constructors i.e. a
constructor can be overloaded.
Whenever an
object of a class is created it calls a constructor by default which is
responsible for initializing the object. By default
every class has a
default constructor which is a constructor with no arguments. However once you
provide a constructor to a class
then the default
constructor does not exist. e.g. class Stack{ int size;int top; int arr [];
Stack(int a) //constructor of the class { size = a;
arr = new
int[size]; }}; The destructor is the last member function called in the
lifetime of a class object. Its job is to free the resources
that an object is
holding. A class can have no more than a single destructor. The name of the
destructor is ~ classname (). Like a
constructor, a
destructor cannot have a void return type. e.g. ~Stack () //destructor { delete
[] arr; }
======================
What is Inheritance ? How is a Class Inherited in C++ ?
Inheritance is
one of the most important principles of object oriented language. Using
inheritance one can create a class that can
have traits
common to a set of related items. This class is then inherited by other classes
each adding things are specific to them.
The class that is
inherited is called the base class and the class that inherits from it is
called as the derived class. When a class
inherits a base
class, then all the members of the base class become members of the derived
class. E.g. class derived-class-name::
access
base-class-name{ //body of class}; The access of the members in the base class
by derived class depends on the access
parameter. The
access specifier must either be private, public or protected. If one doesn’t
provide an access specifier then it is taken
as private by
default. When access specifier is private then these members remain private to
base class and the derived class cannot
access them. When
access specifier is public then all the public members of a base class become
public members of the derived
class and all the
protected members of the base class become protected in the derived class. On
using a protected access specifier
all public and
protected members of the base class become protected members of the derived
class.
================================
What are Virtual Functions ? Why do we need Virtual Functions? Explain with
an example.
A function that
is defined in a base class but overridden by the derived class is called a
virtual function. To create virtual functions
precede the
function declaration in the base class with the keyword virtual. When a class
containing a virtual function is inherited the
derived class
overrides the virtual function with its own definition. Virtual functions are
like member functions however what makes
them different is
the capability to support run time polymorphism when accessed via a pointer. A
base class pointer can point to an
object of a
derived class. When a base class pointer points to an object of a derived class
that contains a virtual function, C++
determines which
function version to call based on the type of object pointed by the base class
pointer. This is runtime polymorphism
as it can be
determined at run time. In this way when different objects are pointed to then
different versions of virtual functions are
executed.
Whenever a virtual function is defined all aspects of its prototype should
match. Also virtual functions should be non static
members of the
class and they cannot be friend functions too. E.g. class base { public:
virtual void display (); }; class derived: public{
public: virtual
void display ();};base *p, b;derived d1, d2;p = &b;p->display (); //calls
base class functionp = &d1;p->display (); //calls
derived class
function
======================
What are Templates in C++ ? How are Templates declared and used ?
Many data
structures and algorithms can be defined independently of the type of data they
manipulate. A template allows the
separation of the
type dependent part from the type independent part. This results in a
significant amount of code reusability.
Templates can be
class templates or function templates. A class template is used for creating a
class in which one more values are
parameterized.
The syntax of a class template is:
template class
class-name{ ...};
A class template
can also have multiple parameters.
template class
class-name{ ...};
Example -
template class
Array{ private: T *arr []; public: Array (int size = 10); };template
Array::Array(int
size){ arr = new
T[size];}
Create an Array
object as: Array a; The function template is also written using the keyword
template.
E.g. template
class void push (T &element) { arr[top] = elemen
========================
What is Polymorphism ? How is Polymorphism achieved in C++ ?
Polymorphism is
one of the most important principle of object oriented language. Polymorphism
means many forms i.e. one interface
multiple methods.
The specific method to call depends on the nature of the situation. No matter
what type of car it is the driving
mechanism is the
same. For example, you might have a program that defines three different types
of stacks. One stack is used for
integer values,
one for character values, and one for floating-point values. Because of
polymorphism, you can define one set of
names, push() and
pop() , that can be used for all three stacks. In your program you will create
three specific versions of these
functions, one
for each type of stack, but names of the functions will be the same. The
compiler will automatically select the right
function based
upon the data being stored. Thus, the interface to a stack—the functions push()
and pop() —are the same no matter
which type of
stack is being used. C++ supports both run time and compile time polymorphism.
Function overloading is a form of
compile time
polymorphism while dynamic binding is a form of runtime polymorphism.
===============
What are the Standard Exceptions in C++ ?
C++ defined a
hierarchy of standard exceptions that are thrown at runtime whenever an
abnormal condition takes place. These
exceptions are
derived from std::exception class defined in the header. Since there is a
common base class of all these exceptions it
enables the
application to catch these exceptions in a single catch statement. E.g. catch
(std::exception &e){//code to handle the
exception} Some
of the standard exceptions that are built in the language are: -
std::bad_alloc: thrown by operator new -
std::bad_cast: as
a result of dynamic_cast - std::bad_typeid: as a result of operator typeid -
std::bad_exception: Whenever you want
to catch all
exceptions then the exception parameter in the catch block should be an
ellipsis. E.g. catch (…){ //this block will catch all
exceptions}
==============
What is Multiple Inheritance in C++ ? Explain with an example
It is possible
for a derived class to inherit more than a single base class. This is referred
as multiple inheritance. The class inherits
from multiple
base classes where these classes are comma separated. Each listed base class
must specify its own access level.
E.g.
class base1
{}
;
class base2
{}
;
class derived:
public base1, public base2
{
};
The base class
constructors are invoked in the declaration order within the class derivation
list. In the above example the constructor
for base1 will be
called first followed by the base2 constructor. Similarly the order of
destructor is reverse of the constructor order.
If a class
inherits from one or more base classes which themselves inherit from a common
base class then it can lead to problems. In
such case one
should use virtual inheritance. Under virtual inheritance only a single shared
base class object is inherited regardless
of how many times
the base class occurs in the derivation hierarchy.
E.g.
class derived:
public virtual base1, public virtual base2
{}
;
==================
What is a Copy Constructor in C++ ? Give an example
Copy constructor
is a type of constructor which constructs an object by copying the state from
another object of the same class.
Whenever an
object is copied, another object is created and in this process the copy
constructor gets called. If the class of the object
being copied is
x, the copy constructor’s signature is usually x::x (const x&).
Let’s take an
example to illustrate this:
class Complex
{ int real, img;
public:
Complex (int,
int);
Complex (const
Complex& source); //copy constructor
};Complex::
Complex (const Complex& source)
{ this.real =
source.real;
this.img =
source.img;
}
main ()
{
Complex a (2, 3);
Complex b = a; //
this invokes the copy constructor
}
A copy
constructor is called whenever an object is passed by value, returned by value
or explicitly copied.
==================================
What is Function Overloading in C++ ?
Function
overloading is the process of using the same name for two or more functions.
However each function will be different in
terms of either
different types of parameters or a different number of parameters. It is only
through these differences that the compiler
knows which
function to call in any given situation. Even if the number of parameters are
same and types are same but they are
written in a
different order then these functions will still be considered different. The
return type parameter does not hold any
relevance to make
two functions distinct. E.g. void display (int a);void display (string str);
Both the above functions have the same
name but
different parameters. So when a function display (2) is called the compiler
calls the first function and when the argument
passed to display
is a string then the second version is invoked.E.g. int display (int a );void
display (int a); In the above example the
compiler will
generate a compile time error as the return types are insufficient to overload
functions
====================================
What are Pointers in C++ (Object Oriented Programming) ?
Pointers are used
to store memory address values of objects. C++ defines a special address-of
operator that when applied to an
object returns
that object’s address value. E.g. int *pint; //this defines a pointer
variableIn order store the address of the variable ‘j’ into
pint one should
assign the address of j into pint variable as follows:pint = &j; //
assigning the address of variable j into pointer pint In
order to access
the actual object pint addresses we must first dereference pint using the
dereference operator (*). *pint = *pint + 1; //
this statement
will increment the value pint points to by 1 The type of the pointer variable
should be the same as the variable whose
address it is
used to hold. E.g. you cannot define a pointer variable of type float and use
it to assign the address of a variable of type
integer
========================
What are volatile variables ? Explain Volatile variables
A variable is
declared as volatile if its value can possibly be changed in ways outside
either the control or detection of the compiler.
For example a
variable that is updated by the system clock. Certain optimizations ordinarily
performed by a compiler should therefore
not be applied to
objects the programmer specifies as volatile. The volatile qualifier is used in
much the same way as is the const
qualifier as an
additional modifier to a type.E.g. volatile int count_value; The purpose of
defining a variable as volatile is to inform the
compiler that the
variable can change in ways undetectable by the compiler and hence the compiler
should not perform any kind of
optimizations on
these variables.
============================
What is the Difference between Overloaded Functions and Overridden
Functions ?
In C++,
overloading is simply the use of the same function identifier for different
functions declared in the same scope.
E.g. void display
(int);void display (string);
The above two
functions are clearly overloaded. The compiler will distinguish among them by
the actual argument used in the call to
display.
Overriding can
occur only in the presence of a base class virtual function. Overriding has
nothing whatsoever to do with overloading.
A nonvirtual base
class function cannot be overridden, only hidden. In overriding the function
prototype in the derived class has to be
exactly the same
as the one in the base class
=============================
What are Inline Functions ? When are Inline Functions used ?
The idea behind
inline functions is to insert the code of a called function at the point where
the function is called. It is useful to
distinguish between
"inline," a keyword qualifier that is simply a request to the
compiler, and "inlined," which refers to actual inline
expansion of the
function. A function can be decorated with the inline keyword either in the
class definition or in its own definition if the
definition
physically occurs before the function is invoked. The compiler does not promise
that an inline function will be inlined, and the
details of
when/when not are compiler-dependent. On the other hand, any function that is
defined within the class body will be treated
implicitly as an
inline function with or without the explicit inline keyword. Inline code is
faster than a function call for two reasons. First,
a CALL
instruction takes time to execute. Second, if there are arguments to pass, these
have to be placed on the stack, which also
takes time
============================
What are Mutable and Const in C++ ?
Class member
functions may be declared as const, which causes them to be treated as a const
pointer. Thus, that function cannot
modify the object
that invokes it. Also, a const object may not invoke a non-const member
function. However, a const member
function can be
called by either const or non-const objects. Sometimes there will be one or
more members of a class that you want a
const function to
be able to modify even though you don't want the function to be able to modify
any of its other members. You can
accomplish this
through the use of mutable. It overrides constness. That is, a mutable member
can be modified by a const member
function. E.g.
class MyClass{ int i; mutable int j; Public: void setValues const () { i = 10;
//wrong j = 15; //correct }};
===========================
What is ‘this’ Pointer (object) in C++
When a member
function is called, it is automatically passed an implicit argument that is a
pointer to the invoking object (that is, the
object on which
the function is called).This pointer is called this.Within a member function,
the members of a class can be accessed
directly,
withoutany object or class qualification. The this pointer points to the object
that invoked the member function. Also the this
pointer is
automatically passed to all member functions. Another thing to note is that the
friend functions are not members of a class
and, therefore,
are not passed a this pointer. Second, static member functions do not have a
this pointer. e.g. class Stack { int top; int
size; Stack (int
top, int size) { this.top = top; this.size = size; }};
========================
What is Scope Resolution Operator in C++?
There are two
used of the scope resolution operator in C++. The first use being that a scope
resolution operator is used to unhide the
global variable
that might have got hidden by the local variables. Hence in order to access the
hidden global variable one needs to
prefix the
variable name with the scope resolution operator (::). e.g. int i = 10; int
main () { int i = 20; Cout << i; // this prints the value
20 Cout <<
::i; // in order to use the global i one needs to prefix it with the scope
//resolution operator. } The second use of the
operator is used
to access the members declared in class scope. Whenever a scope resolution
operator is used the name of the
member that
follows the operator is looked up in the scope of the class with the name that
appears before the operator.
==================================
What is Scope Resolution Operator in C++?
There are two
used of the scope resolution operator in C++. The first use being that a scope
resolution operator is used to unhide the
global variable
that might have got hidden by the local variables. Hence in order to access the
hidden global variable one needs to
prefix the
variable name with the scope resolution operator (::). e.g. int i = 10; int
main () { int i = 20; Cout << i; // this prints the value
20 Cout <<
::i; // in order to use the global i one needs to prefix it with the scope
//resolution operator. } The second use of the
operator is used
to access the members declared in class scope. Whenever a scope resolution
operator is used the name of the
member that
follows the operator is looked up in the scope of the class with the name that
appears before the operator.
===================
What are Const Member Functions in C++ ?
There can be two
cases in which a member function can be declared as a const function: whenever
the member function wants to
guarantee that it
won't make any changes to its this object or whenever a caller needs to invoke
the member function via a referenceto-
const or
pointer-to-const. The compiler wont allow a const member function to change
*this or to invoke a non-const member
function for this
object. E.g. int getCount() const;int getCount () const{ //function definition}
===========================
Explain Composition in C++ with an example
Composition
allows software to be developed by assembling existing components rather than
creating new ones. Composition is also
sometimes called
as aggregation and defines the process of putting an object inside another
object. It models the has-a relationship.
E.g. a class
employee can contain an object of type salary which itself is another type of
object. e.g.
class Salary{
private: double DA; double HRA; double travelAllowance; double basic salary;
public: //member functions};Class
Employee{
private: int empno; Salary salary; //composition: salary object is contained
inside employee public: //member functions};
==================
What do you mean by ‘Return by Reference’ in C++ ?
A function can be
declared to return a pointer or a reference. When the function is returning a
reference, the calling function receives
the lvalue for
the variable. The calling function can then modify the variable or take its
address.
If the return
value is a large class object, using a reference (or pointer) return type is
more efficient than returning the class object by
value. In some
cases, the compiler can automatically transform a return by value to a return
by reference.
E.g.
Complex&
compute (Complex c)
{
Complex *tmp =
new Complex ();
// …
return tmp;
}However care
should be exercised when returning a reference to a local object. The lifetime
of the local object terminates with the
termination of
the function. The reference is left aliasing undefined memory after the
function terminates.
====================
What are static Data and Static Member Functions in C++ ?
Static data
members are data and functions that are associated with the class itself,
rather than with the objects of the class. For
example a count
is needed of how many objects of a particular class type have been created at
any one point in the program. A static
data member acts
as a global object that belongs to its class type. Unlike other data members
where each class object has its own
copy, there is
only one copy of a static data member per class type. A static data member is a
single, shared object accessible to all
objects of its
class type. A data member is made static by prefixing the data member
declaration within the class body with the
keyword static or
prefixing the function declaration with the keyword static. A static function
cannot access any other member
variables of the
object. One does not need to create a class object for accessing a static
member or a static function; a static function
can be invoked
using the class name as class_name::static_member_function. e.g. class
ShoppingCart{ private: static int totalItems;
//static data member public: static int getTotalItems (); //static member
function};
What is a Pure Virtual Member Function ?
Whenever a
virtual function in a base class is not redefined by the derived class then the
version defined in the base class will be
used. However in
many cases it may so happen that there can be no meaningful definition of a
virtual function within the base class.
Or you may want
to ensure that all derived classes override a virtual function. To handle both
these cases the solution is a pure virtual
function.
A pure virtual
function is a function that has no definition in the base class. The definition
of such a function is equal to 0.E.g. void
draw () = 0; //
this is a pure virtual function
If a class
contains at least one virtual function then that class is called an abstract
class and one cannot create an instance of an
abstract class.
Also if a class inherits from a class that contains a pure virtual function
then the derived class has to provide a
definition for
the pure virtual function. Failure to do so will result in an abstract derived
class.
==============================
What are Preprocessor Directives ?
The preprocessor
directives are instructions to the compiler. All these preprocessor lines begin
with a pound (#). They are executed
before the
compilation of the code begins. These directives can only span a single line
and does not need to end in a semicolon.
The preprocessor
contains the following directives:
- #define: this
defines an identifier and some value to this identifier. This value can be any
character sequence and will be substituted
in the code file
for each instance of the corresponding identifier.
e.g. #define MIN
0
- #include: it
tells the compiler to link to another source file. The name of the source file
can be in angle brackets or double quotes.
e.g. #include
- #error: tells
the compiler to stop compilation. Used primarily for debugging purposes.
- #if:
- #elif
- #endif
- #else: The
above four directives are conditional directives. They allow you to
conditionally include portions of code based on
outcome of a constant
expression.
E.g. #if OPTION
== 1
//do something
#else
//do something
else
#endif
- #ifndef
- #undef: the
above indicates conditional compilation dependinf upon if a variable is defined
or not defined.
======================================