What
is overloading??
With the C++ language,
you can overload functions and operators. Overloading is the practice of supplying
more than one definition for a given function name in the same scope.
- Any two functions in a
set of overloaded functions must have different argument lists.
- Overloading functions with argument lists of the same types, based on return type alone, is an error.
- Overloading functions with argument lists of the same types, based on return type alone, is an error.
What
is Overriding?
To override a method, a
subclass of the class that originally declared the method must declare a method
with the same name, return type (or a subclass of that return type), and same
parameter list.
The definition of the method overriding is:
· Must have same method name.
· Must have same data type.
· Must have same argument list.
Overriding a method means that replacing a method functionality in child class. To imply overriding functionality we need parent and child classes. In the child class you define the same method signature as one defined in the parent class.
The definition of the method overriding is:
· Must have same method name.
· Must have same data type.
· Must have same argument list.
Overriding a method means that replacing a method functionality in child class. To imply overriding functionality we need parent and child classes. In the child class you define the same method signature as one defined in the parent class.
What
is "this" pointer?
The this pointer is a
pointer accessible only within the member functions of a class, struct, or
union type. It points to the object for which the member function is called.
Static member functions do not have a this pointer.
When a nonstatic member
function is called for an object, the address of the object is passed as a
hidden argument to the function. For example, the following function call
myDate.setMonth( 3 );
can be interpreted this
way:
setMonth( &myDate, 3
);
The object's address is
available from within the member function as the this pointer. It is legal,
though unnecessary, to use the this pointer when referring to members of the
class.
What
happens when you make call "delete this;" ??
The code has two
built-in pitfalls. First, if it executes in a member function for an extern,
static, or automatic object, the program will probably crash as soon as the
delete statement executes. There is no portable way for an object to tell that
it was instantiated on the heap, so the class cannot assert that its object is
properly instantiated. Second, when an object commits suicide this way, the
using program might not know about its demise. As far as the instantiating
program is concerned, the object remains in scope and continues to exist even
though the object did itself in. Subsequent dereferencing of the pointer can
and usually does lead to disaster.
You should never do
this. Since compiler does not know whether the object was allocated on the
stack or on the heap, "delete this" could cause a disaster.
How
virtual functions are implemented C++?
Virtual functions are
implemented using a table of function pointers, called the vtable. There
is one entry in the table per virtual function in the class. This table
is created by the constructor of the class. When a derived class is
constructed, its base class is constructed first which creates the
vtable. If the derived class overrides any of the base classes virtual
functions, those entries in the vtable are overwritten by the derived class
constructor. This is why you should never call virtual functions from a
constructor: because the vtable entries for the object may not have been set up
by the derived class constructor yet, so you might end up calling base class
implementations of those virtual functions
What
is name mangling in C++??
The process of encoding
the parameter types with the function/method name into a unique name is called
name mangling. The inverse process is called demangling.
For example
Foo::bar(int, long) const is mangled as `bar__C3Fooil'.
For a constructor, the method name is left out. That is Foo::Foo(int, long) const is mangled as `__C3Fooil'.
For a constructor, the method name is left out. That is Foo::Foo(int, long) const is mangled as `__C3Fooil'.
What
is the difference between a pointer and a reference?
A reference must always
refer to some object and, therefore, must always be initialized; pointers do
not have such restrictions. A pointer can be reassigned to point to different
objects while a reference always refers to an object with which it was
initialized.
How
are prefix and postfix versions of operator++() differentiated?
The postfix version of
operator++() has a dummy parameter of type int. The prefix version does not
have dummy parameter.
What
is the difference between const char *myPointer and char *const myPointer?
Const char *myPointer is
a non constant pointer to constant data; while char *const myPointer is a
constant pointer to non constant data.
How
can I handle a constructor that fails?
throw an exception.
Constructors don't have a return type, so it's not possible to use return
codes. The best way to signal constructor failure is therefore to throw an
exception.
How
can I handle a destructor that fails?
Write a message to a
log-file. But do not throw an exception.
The C++ rule is that you must never throw an exception from a destructor that is being called during the "stack unwinding" process of another exception. For example, if someone says throw Foo(), the stack will be unwound so all the stack frames between the throw Foo() and the } catch (Foo e) { will get popped. This is called stack unwinding.
During stack unwinding, all the local objects in all those stack frames are destructed. If one of those destructors throws an exception (say it throws a Bar object), the C++ runtime system is in a no-win situation: should it ignore the Bar and end up in the } catch (Foo e) { where it was originally headed? Should it ignore the Foo and look for a } catch (Bar e) { handler? There is no good answer -- either choice loses information.
So the C++ language guarantees that it will call terminate() at this point, and terminate() kills the process. Bang you're dead.
The C++ rule is that you must never throw an exception from a destructor that is being called during the "stack unwinding" process of another exception. For example, if someone says throw Foo(), the stack will be unwound so all the stack frames between the throw Foo() and the } catch (Foo e) { will get popped. This is called stack unwinding.
During stack unwinding, all the local objects in all those stack frames are destructed. If one of those destructors throws an exception (say it throws a Bar object), the C++ runtime system is in a no-win situation: should it ignore the Bar and end up in the } catch (Foo e) { where it was originally headed? Should it ignore the Foo and look for a } catch (Bar e) { handler? There is no good answer -- either choice loses information.
So the C++ language guarantees that it will call terminate() at this point, and terminate() kills the process. Bang you're dead.
What
is Virtual Destructor?
Using virtual
destructors, you can destroy objects without knowing their type - the correct
destructor for the object is invoked using the virtual function mechanism. Note
that destructors can also be declared as pure virtual functions for abstract
classes.
if someone will derive
from your class, and if someone will say "new Derived", where
"Derived" is derived from your class, and if someone will say delete
p, where the actual object's type is "Derived" but the pointer p's
type is your class.
Can you think of a situation where your program would crash without reaching the breakpoint which you set at the beginning of main()?
C++ allows for dynamic
initialization of global variables before main() is invoked. It is possible
that initialization of global will invoke some function. If this function
crashes the crash will occur before main() is entered.
Name
two cases where you MUST use initialization list as opposed to assignment in
constructors.
Both non-static const
data members and reference data members cannot be assigned values; instead, you
should use initialization list to initialize them.
Can
you overload a function based only on whether a parameter is a value or a
reference?
No. Passing by value and
by reference looks identical to the caller.
What
are the differences between a C++ struct and C++ class?
The default member and
base class access specifiers are different.
The C++ struct has all
the features of the class. The only differences are that a struct defaults to
public member access and public base class inheritance, and a class defaults to
the private access specifier and private base class inheritance.
What
does extern "C" int func(int *, Foo) accomplish?
It will turn off
"name mangling" for func so that one can link to code compiled by a C
compiler.
How
do you access the static member of a class?
What
is multiple inheritance(virtual inheritance)? What are its advantages and
disadvantages?
Multiple Inheritance is
the process whereby a child can be derived from more than one parent class. The
advantage of multiple inheritance is that it allows a class to inherit the
functionality of more than one base class thus allowing for modeling of complex
relationships. The disadvantage of multiple inheritance is that it can lead to
a lot of confusion(ambiguity) when two base classes implement a method with the
same name.
What
are the access privileges in C++? What is the default access level?
The access privileges in
C++ are private, public and protected. The default access level assigned to
members of a class is private. Private members of a class are accessible only
within the class and by friends of the class. Protected members are accessible
by the class itself and it's sub-classes. Public members of a class can be
accessed by anyone.
What
is a nested class? Why can it be useful?
A nested class is a
class enclosed within the scope of another class. For example:
// Example
1: Nested class
//
class OuterClass
{
class NestedClass
{
// ...
};
// ...
};
Nested classes are useful for organizing code and controlling access and dependencies. Nested classes obey access rules just like other parts of a class do; so, in Example 1, if NestedClass is public then any code can name it as OuterClass::NestedClass. Often nested classes contain private implementation details, and are therefore made private; in Example 1, if NestedClass is private, then only OuterClass's members and friends can use NestedClass.
//
class OuterClass
{
class NestedClass
{
// ...
};
// ...
};
Nested classes are useful for organizing code and controlling access and dependencies. Nested classes obey access rules just like other parts of a class do; so, in Example 1, if NestedClass is public then any code can name it as OuterClass::NestedClass. Often nested classes contain private implementation details, and are therefore made private; in Example 1, if NestedClass is private, then only OuterClass's members and friends can use NestedClass.
When you instantiate as
outer class, it won't instantiate inside class.
What
is a local class? Why can it be useful?
local class is a class
defined within the scope of a function -- any function, whether a member
function or a free function. For example:
// Example
2: Local class
//
int f()
{
class LocalClass
{
// ...
};
// ...
};
Like nested classes, local classes can be a useful tool for managing code dependencies.
//
int f()
{
class LocalClass
{
// ...
};
// ...
};
Like nested classes, local classes can be a useful tool for managing code dependencies.
Can
a copy constructor accept an object of the same class as parameter, instead of
reference of the object?
No. It is specified in
the definition of the copy constructor itself. It should generate an error if a
programmer specifies a copy constructor with a first argument that is an object
and not a reference.
The declaration tells the compiler that at some later point we plan to present the definition of this declaration.
E.g.: void stars () //function declaration
The definition contains the actual implementation.
E.g.: void stars () // declarator
{
for(int j=10; j > =0; j--) //function body
cout << *;
cout << endl; }
Does c++ support multilevel and multiple inheritance?
Yes.
What is a template?
Templates allow to create generic functions that admit any data type as parameters and return value without having to overload the function with all the possible data types. Until certain point they fulfill the functionality of a macro. Its prototype is any of the two following ones:
template
The only difference between both prototypes is the use of keyword class or typename, its use is indistinct since both expressions have exactly the same meaning and behave exactly the same way.
Define a constructor - What it is and how it might be called (2 methods).
Answer1
constructor is a member function of the class, with the name of the function being the same as the class name. It also specifies how the object should be initialized.
Ways of calling constructor:
1) Implicitly: automatically by complier when an object is created.
2) Calling the constructors explicitly is possible, but it makes the code unverifiable.
Answer2
class Point2D{
int x; int y;
public Point2D() : x(0) , y(0) {} //default (no argument) constructor
};
main(){
Point2D MyPoint; // Implicit Constructor call. In order to allocate memory on stack, the default constructor is implicitly called.
Point2D * pPoint = new Point2D(); // Explicit Constructor call. In order to allocate memory on HEAP we call the default constructor.
No comments:
Post a Comment