472,780 Members | 1,129 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,780 software developers and data experts.

Overloaded typecast operators and copy constructors

I have a few questions regarding overloaded typecast
operators and copy constructors that I would like an
answer for. Thanks in advance.

Masood

(1) In some examples that I have seen pertaining to
casting class A to class B, the implementation of the
overloaded typecast operator does something like this:

A::operator B(...)
{
B localCopy(...);
// perhaps some attributes of the "this" object
// are passed to the constructor

return localCopy;
}

Is this correct? Aren't we returning a local copy of
B?
(2) It appears that the following syntaxes are
equivalent:
[Here b is an instance of Class Y and Class Y has an
overloaded typecast operator for Class X]
(a) X c = (X)b; // Typecast style
(b) X c = X(b); // Function call style

Is this correct?
(3) I am surprised that the typecasting to self type is
allowed. If we have a class that supports both a copy
constructor with one argument and an overloaded
typecast operator to its own type (for whatever
reason), it appears that they will have identical
calling syntaxes.

Is this correct? If this is correct, how does the
compiler remove the ambiguity.

I have a small coding sample that illustrates my
doubts.
/////////////////////////////////////////////////////////////
#include <string.h>
#include <iostream.h>

class First
{
int value;
public:
First(int i = 0)
{
value = i;
}

operator int() // typecast to integer
{
return value;
}
};
class Second
{
int data;
char label[100];

public:
Second(int i = 0, char* str = "???")
{
data = i;
strcpy(label, str);
}

Second(const Second& obj) // Copy constructor
{
cout << "Copy constructor called\n";
data = obj.data;
strcpy(label, obj.label);
}

operator char*() // typecast to char*
{
return label;
}

operator First() // typecast to First
{
First f(data);
return f;
}

operator Second() // typecast to Self-type
{
cout << "Typecast operator to self called\n";
Second s(data, label);
return s;
}
};
int
main()
{
First first_a(56);

cout << "It is " << (int)first_a << endl;

Second second_b(98, "Howdy Doody");

First first_c = (First)second_b; // typecast style conversion
First first_d = First(second_b); // function call style conversion

cout << "ONE: It is " << (int)first_c
<< " and " << (char *)second_b << endl;
cout << "TWO: It is " << (int)first_d
<< " and " << (char *)second_b << endl;

Second second_e(second_b);
// What got called ---- the overloaded typecast
// self-type or the copy constructor?

return 0;
}

Jul 23 '05 #1
1 2160
<ma**********@lycos.com> wrote...
I have a few questions regarding overloaded typecast
operators and copy constructors that I would like an
answer for. Thanks in advance.

Masood

(1) In some examples that I have seen pertaining to
casting class A to class B, the implementation of the
overloaded typecast operator does something like this:

A::operator B(...)
{
B localCopy(...);
// perhaps some attributes of the "this" object
// are passed to the constructor

return localCopy;
}

Is this correct? Aren't we returning a local copy of
B?
It is correct. We're returning a copy of 'localCopy'.
(2) It appears that the following syntaxes are
equivalent:
[Here b is an instance of Class Y and Class Y has an
overloaded typecast operator for Class X]
(a) X c = (X)b; // Typecast style
(b) X c = X(b); // Function call style

Is this correct?
Depends on what 'X' is like. If it has a constructor that
accepts 'Y', then no, it's not correct.
(3) I am surprised that the typecasting to self type is
allowed.
You mean

struct A {
operator A();
};

?
If we have a class that supports both a copy
constructor with one argument and an overloaded
typecast operator to its own type (for whatever
reason), it appears that they will have identical
calling syntaxes.
It does, doesn't it?
Is this correct? If this is correct, how does the
compiler remove the ambiguity.
The conversion to the same object type is never used
directly. It can only be reached through a virtual
function call. See 12.3.2/1.

I have a small coding sample that illustrates my
doubts.
/////////////////////////////////////////////////////////////
#include <string.h>
#include <iostream.h>
#include <iostream>
using std::cout;
using std::endl;

class First
{
int value;
public:
First(int i = 0)
{
value = i;
}

operator int() // typecast to integer
{
return value;
}
};
class Second
{
int data;
char label[100];

public:
Second(int i = 0, char* str = "???")
Second(int i = 0, char const* str = "???")
{
data = i;
strcpy(label, str);
strncpy(label, str, 99);
label[99] = 0;
}

Second(const Second& obj) // Copy constructor
{
cout << "Copy constructor called\n";
data = obj.data;
strcpy(label, obj.label);
}

operator char*() // typecast to char*
{
return label;
}

operator First() // typecast to First
{
First f(data);
return f;
}

operator Second() // typecast to Self-type
{
cout << "Typecast operator to self called\n";
Second s(data, label);
return s;
}
};
int
main()
{
First first_a(56);

cout << "It is " << (int)first_a << endl;

Second second_b(98, "Howdy Doody");

First first_c = (First)second_b; // typecast style conversion
First first_d = First(second_b); // function call style conversion

cout << "ONE: It is " << (int)first_c
<< " and " << (char *)second_b << endl;
cout << "TWO: It is " << (int)first_d
<< " and " << (char *)second_b << endl;

Second second_e(second_b);
// What got called ---- the overloaded typecast
// self-type or the copy constructor?
The copy constructor.

return 0;
}

Jul 23 '05 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: Nitin Bhardwaj | last post by:
Thanx in advance for the response... I wanna enquire ( as it is asked many a times in Interviews that i face as an Engg PostGraduate ) about the overloading capability of the C++ Language. ...
5
by: Andy Jarrell | last post by:
I'm trying to inherit from a specific class that has an overloaded operator. The problem I'm getting is that certain overloaded operators don't seem to come with the inheritance. For example: ...
3
by: N4M | last post by:
Dear, I have problems with overloaded operators ++() and --(). MSVC++ 6.0 compiler gives errors, one is shown as below: " c:\data\c++\mygraphs\graph.h(182) : error C2555: 'CGraphNodeIter::++' :...
4
by: August1 | last post by:
I've written an interface and implementation file along with a client source file that allows the use of an overloaded subtraction operator. However, when using the program, I'm running into a...
14
by: ambar.shome | last post by:
Hi, As you know there are few operators in C++ which cant be overloaded. They are: .., .*, ::, ?: , new , delete , sizeof , typeid , static_casr , dynamic_cast , const_cast ,...
5
by: raylopez99 | last post by:
I need an example of a managed overloaded assignment operator for a reference class, so I can equate two classes A1 and A2, say called ARefClass, in this manner: A1=A2;. For some strange reason...
3
by: ryan.gilfether | last post by:
I have a problem that I have been fighting for a while and haven't found a good solution for. Forgive me, but my C++ is really rusty. I have a custom config file class: class ConfigFileValue...
3
by: iluvatar | last post by:
Hi all. I have written a 3d-vector class (for 3-dimensional space) and I have overloaded the arihtmetic operators like +, +=, * and so on. Also, the constructor works with doubles and has...
5
by: sam_cit | last post by:
Hi Everyone, I was just wondering, about the overloaded assignment operator for user defined objects. It is used to make sure that the following works properly, obj1 = obj; so the...
0
by: Rina0 | last post by:
Cybersecurity engineering is a specialized field that focuses on the design, development, and implementation of systems, processes, and technologies that protect against cyber threats and...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.