Hello,
This is the program that I am trying. The program executes but does not give
me a desired output.
*************** *************** *************** *
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
class string{
int length;
char *str;
public:
string()
{
length = 0;
str = new char [length + 1];
strcpy(str, "\0");
}
string(const char *string)
{
cout<< "In the constructor" <<endl;
length = strlen(string);
str = new char [length + 1];
strcpy (str, string);
}
void display (void)
{
cout <<"The length is : " << length<< endl;
cout <<"The string is : " << str << endl;
}
~string()
{
cout << "In the destructor " << length << endl;
delete [] str;
}
};
void main (void)
{
string A;
A.display();
A = string("Praveen "); //explicit call
A.display();
}
*************** *************** *************** ***********
The output that I get is
The length is : 0
The string is :
In the constructor
In the destructor 7
The length is : 7
The string is : èö
In the destructor 7
Now my question is
1. why is the "destructor 7" called twice? I would expect "destructor 0" to
be called once and "destructor 7" called the next time. Am I correct?
2. I want to know is that line having a comment "explicit call" correct?
Can I make a call like this?
I would assume that my program has a bug (or is wrong) but I can not find
out. Please Help.
Thanks and Regards,
Praveen Kumar 9 8284
sahukar praveen wrote: Hello,
This is the program that I am trying. The program executes but does not give me a desired output.
*************** *************** *************** * #include <iostream.h> #include <iomanip.h> #include <string.h>
class string{ int length; char *str; public: string() { length = 0; str = new char [length + 1]; strcpy(str, "\0"); } string(const char *string) { cout<< "In the constructor" <<endl; length = strlen(string); str = new char [length + 1]; strcpy (str, string); } void display (void) { cout <<"The length is : " << length<< endl; cout <<"The string is : " << str << endl; } ~string() { cout << "In the destructor " << length << endl; delete [] str; } };
void main (void) { string A;
A.display(); A = string("Praveen "); //explicit call A.display(); } *************** *************** *************** ***********
The output that I get is
The length is : 0 The string is : In the constructor In the destructor 7 The length is : 7 The string is : èö In the destructor 7
Now my question is
1. why is the "destructor 7" called twice? I would expect "destructor 0" to be called once and "destructor 7" called the next time. Am I correct? 2. I want to know is that line having a comment "explicit call" correct? Can I make a call like this?
I would assume that my program has a bug (or is wrong) but I can not find out. Please Help.
1. main returns int, not void
2. I believe that the first destructor 7 call is for the temporary created by
string("Praveen ")
3. You're getting garbage before the second destructor 7 because you don't have
an assignment operator.
What's happening is this:
* A is created length 0
* you display that.
* an unnamed temp is created length 7 containng "Praveen".
* You *BITWISE COPY* it to A (since you don't have an assignment operator),
meaning that A and your unnamed temp have the same value in str
* the unnamed temp is destroyed, destructor called, str is delete[] ed.
HOWEVER!!!! A.str still points to that delete[]'ed memory, and is not a valid
pointer now.
You display A, which puts out the eo garbage
You destroy A, which calls delete[] on an invalid pointe.
You need something like the following inside string:
string& operator=(const string& s)
{
if (str != s.str)
{
char *temp = new char[s.length + 1];
std::strcpy(tem p,s.str);
delete[] str;
str = temp;
length = s.length;
}
return *this;
}
Your assignments will then work properly.
red floyd wrote: Your assignments will then work properly.
But the class still contains a flaw.
The OP needs a copy constructor too.
Rule of three:
Whenever you need one of destructor, copy constructor, assignment operator
you most always need all of them.
--
Karl Heinz Buchegger kb******@gascad .at
Hello,
Thanks for the help. I added a function for assignment operator and a copy
constructor and obtained the correct output.
On reanalyzing the program I have some doubt. Please help me to get it
clarified.
The first destructor is called for the unnamed temp and not for the object
'A'. Am i correct? I had assumed the other way round, that the destructor is
called for object 'A'. So this tells me that if in case I need to reallocate
memory to the already created object it is user's responsibility to do so
(we are doing it in the assignment operator).
My question is 'Only destructors can be called explicitly and not the
constructors. So what is that I am doing in the line A= string("Praveen ")?
Am I not calling the constructor explicitly here?
Thanks and Regards,
Praveen Kumar
"Karl Heinz Buchegger" <kb******@gasca d.at> wrote in message
news:3F******** *******@gascad. at...
red floyd wrote: Your assignments will then work properly. But the class still contains a flaw. The OP needs a copy constructor too.
Rule of three:
Whenever you need one of destructor, copy constructor, assignment
operator you most always need all of them.
-- Karl Heinz Buchegger kb******@gascad .at
sahukar praveen wrote: Hello,
Thanks for the help. I added a function for assignment operator and a copy constructor and obtained the correct output.
On reanalyzing the program I have some doubt. Please help me to get it clarified.
The first destructor is called for the unnamed temp and not for the object 'A'. Am i correct?
Yes.
I had assumed the other way round, that the destructor is called for object 'A'.
Why?
Destructors are called when objects go out of scope.
In
A = string("Praveen "); //explicit call
* A temporary object is created, thus it's ctor is called.
* This temporary object is passed to the assignment operator of A
* Then the statement ends and thus the temporary goes out
of scope -> dtor called for the temporary.
So this tells me that if in case I need to reallocate memory to the already created object it is user's responsibility to do so (we are doing it in the assignment operator).
Not sure what your question is or what the above wants to say. My question is 'Only destructors can be called explicitly and not the constructors. So what is that I am doing in the line A= string("Praveen ")? Am I not calling the constructor explicitly here?
No. You create an object.
Part of object creation is calling a constructor.
Get yourself into the habit of forgetting the idea of beeing able
to call a constructor (you can't). Constructors are called for you
at apropriete places - namely whenever an object comes to live and
the compiler decides which constructor it will use based on what you
specified at the point of object creation.
--
Karl Heinz Buchegger kb******@gascad .at
sahukar praveen wrote: Hello,
Thanks for the help. I added a function for assignment operator and a copy constructor and obtained the correct output.
On reanalyzing the program I have some doubt. Please help me to get it clarified.
The first destructor is called for the unnamed temp and not for the object 'A'. Am i correct?
Yes.
I had assumed the other way round, that the destructor is called for object 'A'.
That's the second one.
So this tells me that if in case I need to reallocate memory to the already created object it is user's responsibility to do so (we are doing it in the assignment operator).
Why is it the user's responsibility then? The assignment operator
handles it for him.
My question is 'Only destructors can be called explicitly and not the constructors.
It's not really an explicit destructor call either. It's a pseudo
destructor call.
So what is that I am doing in the line A=string("Prave en")? Am I not calling the constructor explicitly here?
No. That doesn't just call the constructor, but do everything to create
the object. That object e.g. needs memory, which the constructor
doesn't supply. Note also that you are assigning its value to A, but a
constructor doesn't return any value.
The above is the same as:
string s("Praveen");
A = s;
Just with the difference that you gave the string a name and that it
doesn't go out of scope until the code block ends.
"sahukar praveen" <sa************ @yahoo.co.in> wrote in message news:<3f******@ usenet01.boi.hp .com>... Thanks for the help. I added a function for assignment operator and a copy constructor and obtained the correct output.
On reanalyzing the program I have some doubt. Please help me to get it clarified.
The first destructor is called for the unnamed temp and not for the object 'A'. Am i correct? I had assumed the other way round, that the destructor is called for object 'A'. So this tells me that if in case I need to reallocate memory to the already created object it is user's responsibility to do so (we are doing it in the assignment operator).
My question is 'Only destructors can be called explicitly and not the constructors. So what is that I am doing in the line A= string("Praveen ")? Am I not calling the constructor explicitly here?
string A;
A = string("Praveen ");
You are constructing a temporary object of type "string", assigning it
to the existing object A (through the operator=()) and destroying the
temporary. You could say you're invoking the constructor explicitly,
but you're also invoking the assignment operator and the destructor.
--
Stephen M. Webb
Karl Heinz Buchegger wrote: red floyd wrote:
Your assignments will then work properly.
But the class still contains a flaw. The OP needs a copy constructor too.
Rule of three:
Whenever you need one of destructor, copy constructor, assignment operator you most always need all of them.
Whoops! You're right. I misread the OP's code, and thought the constructor
string(const char *string)
was the copy constructor.
Sahukar, that's an exceptionally bad parameter name.
"sahukar praveen" <sa************ @yahoo.co.in> wrote in message
news:3f******@u senet01.boi.hp. com... My question is 'Only destructors can be called explicitly and not the constructors. So what is that I am doing in the line A= string("Praveen ")? Am I not calling the constructor explicitly here?
I would not say "explicitly ". I would say it's called implicitly as a "side
effect" of creating the variable. I think you'd agree that if the code
looked a little different, there would be nothing explicit about the
constructor for A being called. e.g.
class A
{};
int main()
{
A a;
}
"red floyd" <no*****@here.d ude> wrote in message
news:Bz******** *********@newss vr27.news.prodi gy.com... Karl Heinz Buchegger wrote:
red floyd wrote:
Your assignments will then work properly.
But the class still contains a flaw. The OP needs a copy constructor too.
Rule of three:
Whenever you need one of destructor, copy constructor, assignment
operator you most always need all of them.
Whoops! You're right. I misread the OP's code, and thought the
constructor string(const char *string)
was the copy constructor.
Sahukar, that's an exceptionally bad parameter name.
Hello everybody,
Thanks for all the help. I could guess now what was wrong. I read some book
and as the information in the book was too less to get the overall picture I
had assumed somethings but in a wrong way. I got them cleared and also got
more info from this discussion.
Thanks and Regards,
Praveen Kumar This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Robin Forster |
last post by:
I have two classes:
aule_gl_window (parent class)
and
aule_button (sub class)
I want to call the super class (parent) constructor code from the sub
class constructor.
|
by: Fabian Müller |
last post by:
Hi all,
my question is as follows:
If have a class X and a class Y derived from X.
Constructor of X is X(param1, param2) .
Constructor of Y is Y(param1, ..., param4) .
|
by: JAL |
last post by:
According to MSDN2, if a managed class throws an exception in the
constructor, the destructor will be called. If an exception is thrown in the
constructor the object never existed so how in the world can the destructor
of a object that does not exist get called!
Here is the MSDN2 document:
Code authored in Visual C++ and compiled with /clr will run a type's
destructor for the following reasons:
....
|
by: gurry |
last post by:
Suppose there's a class A. There's another class called B which looks
like this:
class B {
private:
A a;
public :
B() { a.~A() }
}
|
by: sarathy |
last post by:
Hi all,
I have doubt regarding how objects are passed in C++. The
primary problem of passing by value in C++, is that the destructor of
the object passed will be called twice, thus creating possible damage
to the object passed. If that is the case, why isnt the following
program producing the unexpected o/p. I expect the program to print
In B::printValues : 22 33
instead of
| |
by: Szabolcs Horvát |
last post by:
Consider the attached example program: an object of type 'A' is inserted
into a 'map<int, Am;'. Why does 'm;' call the copy constructor of
'A' twice in addition to a constructor call?
The constructors and copy constructors in 'A' report when they are
called. 'whoami' is just a unique identifier assigned to every object of
type 'A'. The output of the program is:
constructor 0
constructor 1
|
by: yancheng.cheok |
last post by:
Hello all, I try to figure out what is the sequence when we create and
delete an object. After experiment on my VC++ 2003, I found that here
is the sequence
new-constructor-destructor-delete
What I am concern is, is this sequence a C++ standard specification? Or
it is compiler dependent?
Thank you. Here is the code I use to perform experiment:
|
by: royashish |
last post by:
Hi all ,
A question to the C++ fraternity , Why the Copy constructor ?
Was suggested in Effective C++ , In Case the Object contains a
Char* , a assignment operator = makes the two object point to the
same address . In this case any Of the two Object is destroyed a
memory leak occurs as one of the object stays on the Heap . My
experiments on the same have proved otherwise .
|
by: JD |
last post by:
Hi,
My associate has written a copy constructor for a class. Now I need to add
an operator = to the class. Is there a way to do it without change her code
(copy constructor) at all? Your help is much appreciated.
JD
|
by: Rahul |
last post by:
Hi Everyone,
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?
class Trial
{
public: Trial()
{
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
| |
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |