Huawei Most Frequently Asked Latest C++ Interview Questions Answers

Write A Note On Encapsulation?

Encapsulation is an object-oriented design approach that closely binds the implementation of a class to its data representation, logically hides the details of the implementation from users of the data type, and provides a public interface to the data type's behavior. It implies an implementation, which is hidden from the class user, and an interface, which is visible to the class user. It helps you to handle large scale programming tasks.The idea behind encapsulation is to take a complex system that demands a lot of attention and to turn it into an object that handles all its work internally and can easily form a concept.

What Are The Effects After Calling The Delete This Operator ?

It is difficult for the compiler to know whether an object is allocated on a stack or a heap. On invoking the delete this operator, the destructor is called twice on the object related to the current context. Firstly implicitly and secondly explicitly. It results in undefined behavior and error-prone conditions. The delete this operator can only work on three conditions

 An Instantiation of a local variable should not take place, after calling the delete this destructor.
 The this pointer should not be used after calling the delete this operator.
 The object of a derived class should be allocated and initialized with the new operator

Can We Get The Value Of Ios Format Flags?

Yes! The ios::flags( ) member function gives the value format flags. This function takes no arguments and returns a long ( typedefed to fmtflags) that contains the current format flags.

Is There Any Function That Can Skip Certain Number Of Characters Present In The Input Stream?

Yes! This can be done using cin::ignore( ) function. The prototype of this function is as shown below

istream& ignore ( int n = 1, int d =EOF );
Sometimes it happens that some extra characters are left in the input stream while taking the input such as, the '\n' (Enter) character. This extra character is then passed to the next input and may pose problem.

To get rid of such extra characters the cin::ignore( ) function is used. This is equivalent to fflush ( stdin ) used in C language. This function ignores the first n characters (if present) in the input stream, stops if delimiter d is encountered.
Huawei Most Frequently Asked Latest C++ Interview Questions Answers
Huawei Most Frequently Asked Latest C++ Interview Questions Answers

When Should Overload New Operator On A Global Basis Or A Class Basis?

We overload operator new in our program, when we want to initialize a data item or a class object at the same place where it has been allocated memory. The following example shows how to overload new operator on global basis.

#include
#include
void * operator new ( size_t s )
{
   void *q = malloc ( s ) ;
   return q ;
}
void main( )
{
  int *p = new int ;
  *p = 25 ;
  cout << *p ;
}

When the operator new is overloaded on global basis it becomes impossible to initialize the data members of a class as different classes may have different types of data members. The following example shows how to overload new operator on class-by-class basis.
#include
#include
class sample
{
  int i ;
  public
     void* operator new ( size_t s, int ii )
     {
       sample *q = ( sample * ) malloc ( s ) ;
       q -> i = ii ;
       return q ;
     }
} ;
class sample1
{
   float f ;
   public
   void* operator new ( size_t s, float ff )
   {
     sample1 *q = ( sample1 * ) malloc ( s ) ;
     q -> f = ff ;
     return q ;
   }
 } ;
void main( )
{
  sample *s = new ( 7 ) sample ;
  sample1 *s1 = new ( 5.6f ) sample1 ;
}
Overloading the operator new on class-by-class basis makes it possible to allocate memory for an object and initialize its data members at the same place.

How To Give An Alternate Name To A Namespace?

An alternate name given to namespace is called a namespace-alias. namespace-alias is generally used to save the typing effort when the names of namespaces are very long or complex. The following syntax is used to give an alias to a namespace.

namespace myname = my_old_very_long_name ;

Define A Pointer To A Data Member Of The Type Pointer To Pointer?

The following program demonstrates this...

#include
class sample
{
  public
    sample ( int **pp )
    {
      p = pp ;
    }
    int **p ;
} ;
int **sample::*ptr = &sample::p ;
void main( )
{
  int i = 9 ;
  int *pi = &i ;
  sample s ( π ) ;
  cout << ** ( s.*ptr ) ;
}

Using A Smart Pointer Can We Iterate Through A Container?

Yes. A container is a collection of elements or objects. It helps to properly organize and store the data. Stacks, linked lists, arrays are examples of containers. Following program shows how to iterate through a container using a smart pointer.

#include
class smartpointer
{
  private
     int *p ; // ordinary pointer
     public
     smartpointer ( int n )
     {
       p = new int [ n ] ;
       int *t = p ;
       for ( int i = 0 ; i <= 9 ; i++ )
         *t++ = i * i ;
     }
     int* operator ++ ( int )
     {
       return p++ ;
     }
     int operator * ( )
     {
       return *p ;
     }
} ;
void main( )
{
   smartpointer sp ( 10 ) ;
   for ( int i = 0 ; i <= 9 ; i++ )
     cout << *sp++ << endl ;
}
Here, sp is a smart pointer. When we say *sp, the operator * ( ) function gets called. It returns the integer being pointed to by p. When we say sp++ the operator ++ ( ) function gets called. It increments p to point to the next element in the array and then returns the address of this new location.

Is It Possible For The Objects To Read And Write Themselves?

Yes! This can be explained with the help of following example

#include
#include
class employee
{
  private
     char name [ 20 ] ;
     int age ;
     float salary ;
     public
     void getdata( )
     {
       cout << "Enter name, age and salary of employee : " ;
       cin >> name >> age >> salary ;
     }
     void store( )
     {
       ofstream file ;
       file.open ( "EMPLOYEE.DAT", ios::app | ios::binary ) ;
       file.write ( ( char * ) this, sizeof ( *this ) ) ;
       file.close( ) ;
     }
     void retrieve ( int n )
     {
       ifstream file ;
       file.open ( "EMPLOYEE.DAT", ios::binary ) ;
       file.seekg ( n * sizeof ( employee ) ) ;
       file.read ( ( char * ) this, sizeof ( *this ) ) ;
       file.close( ) ;
     }
     void show( )
     {
       cout << "Name : " << name
       << endl << "Age : " << age
       << endl << "Salary :" << salary << endl ;
     }
} ;
void main( )
{
   employee e [ 5 ] ;
   for ( int i = 0 ; i <= 4 ; i++ )
   {
     e [ i ].getdata( ) ;
     e [ i ].store( ) ;
   }
   for ( i = 0 ; i <= 4 ; i++ )
   {
     e [ i ].retrieve ( i ) ;
     e [ i ].show( ) ;
   }
}
Here, employee is the class whose objects can write and read themselves. The getdata( ) function has been used to get the data of employee and store it in the data members name, age and salary. The store( ) function is used to write an object to the file. In this function a file has been opened in append mode and each time data of current object has been stored after the last record (if any) in the file.Function retrieve( ) is used to get the data of a particular employee from the file. This retrieved data has been stored in the data members name, age and salary. Here this has been used to store data since it contains the address of the current object. The function show( ) has been used to display the data of employee.

Why Is It Necessary To Use A Reference In The Argument To The Copy Constructor?

If we pass the copy constructor the argument by value, its copy would get constructed using the copy constructor. This means the copy constructor would call itself to make this copy. This process would go on and on until the compiler runs out of memory. This can be explained with the help of following example

class sample
{
   int i ;
   public
   sample ( sample p )
   {
     i = p.i ;
   }
} ;
void main( )
{
   sample s ;
   sample s1 ( s ) ;
}
While executing the statement sample s1 ( s ), the copy constructor would get called. As the copy construct here accepts a value, the value of s would be passed which would get collected in p. We can think of this statement as sample p = s. Here p is getting created and initialized. Means again the copy constructor would get called. This would result into recursive calls. Hence we must use a reference as an argument in a copy constructor.

Post a Comment

Previous Post Next Post