Hi all ,
I have one doubt when i read a book to understand type conversion concepts .

Here's the listing used in that book to demonstrate :

// strconv.cpp
// convert between ordinary strings and class String
#include <iostream>
using namespace std;
#include <string.h>             //for strcpy(), etc.
////////////////////////////////////////////////////////////////
class String                    //user-defined string type
   {
   private:
      enum { SZ = 80 };         //size of all String objects
      char str[SZ];             //holds a C-string
   public:
      String()                  //no-arg constructor
         { str[0] = '\0'; }
      String( char s[] )        //1-arg constructor
         { strcpy(str, s); }    //   convert C-string to String
      void display() const      //display the String
         { cout << str; }
      operator char*()          //conversion operator
         { return str; }        //convert String to C-string
   };
////////////////////////////////////////////////////////////////
int main()
   {
   String s1;                   //use no-arg constructor
                                //create and initialize C-string
   char xstr[] = "Joyeux Noel! ";

   [B]s1 = xstr;                   //use 1-arg constructor
                                //   to convert C-string to String[/B]
   s1.display();                //display String

   String s2 = "Bonne Annee!";  //uses 1-arg constructor
                                //to initialize String
   cout << static_cast<char*>(s2); //use conversion operator
    cout << endl;                  //to convert String to C-string
    return 0;                       //before sending to << op
   }

Now my question is in the following expression

s1 = xstr;

It's explained that one argument constructor will be invoked to perform that conversion .

Will the constructor be invoked after an object is created ?(here 's1')

If it is like this means

String s1 = xstr;

It's clear for me that constructor will be invoked in this case and conversion will takes place but how come the earlier one ?

Please clarify me actually what is happening ?

Thanks in advance

The default class constructor is always called then the c++ class object is declared (except as noted below), for example on line 25 of the code you posted. On line 29 the class's operator= method is called, not the class constructor.

The second example you posted works the same way except its all on the same program line. Hint: whenever you see '=' operator you can be sure the class's operator= method gets called. But if you code it like below then only a constructor is called. String s1(xstr);

Dragon , thanks for your reply but the program doesn't contain any definition for operator = function , moreover the comment line insist that it uses one argument constructor for conversion .

The explanation of the program also insist that the following expression

s1 = xstr;

will invoke the following one argument constructor

String( char s[] )        //1-arg constructor
         { strcpy(str, s); }    //   convert C-string to String

is it true ?
if so can the constructor be called after an object is created ?

Dragon , thanks for your reply but the program doesn't contain any definition for operator = function

I believe Ancient_Dragon is aware that you haven't explicitly defined operator=() in your class, which is why he mentioned it.

Look at the line in your code which he pointed out - you are calling operator=() but have no definition for it - therefore your class is using its default operator=()

The method of initialisation which occurs when using operator=() is not the same as when using explicit object construction - a temporary copy of the object is created first before your object is initialised by way of the assignment operator.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.