Operator přetypování – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Operator přetypování – C / C++ – Fórum – Programujte.comOperator přetypování – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Jurin
~ Anonymní uživatel
16 příspěvků
10. 11. 2014   #1
-
0
-

Mám tento kod

struct MyRef
{
	explicit MyRef(int* inRight) : 
		m_Ref(inRight)
{
}

	int* m_Ref;
};

class XXX
{
public:
	XXX(int* const Ptr = 0):
		m_Val(Ptr)
	{
		cout << "XXX::CTOR(int*)" << endl;
	}

	XXX(XXX &inRight):
		m_Val(inRight.m_Val)
  	{
		cout << "XXX::CTOR(XXX&)" << endl;
  	}

	XXX(MyRef inRight):
		m_Val(inRight.m_Ref)
  	{
		cout << "XXX::CTOR(MyRef)" << endl;
  	}

  	operator MyRef()
  	{
		cout << "operator MyRef" << endl;

	  	MyRef ret(m_Val);
	  	m_Val = 0;
	  	return ret;
  	}

  	~XXX()
  	{
		cout << "XXX::DTOR() " << m_Val << endl;
	  	delete m_Val;
  	}

private:
	int* m_Val;
};

XXX MyCreate()
{
	return XXX(new int);
}

int main()
{
	XXX a = MyCreate();

	return 0;
}

Proč se při volání funkce MyCreate volá konstructor XXX(MyRef inRight) a tím pádem operátor přetypování operator MyRef() ?

Děkuji.

Nahlásit jako SPAM
IP: 84.242.99.–
Reklama
Reklama
vitamin+8
Grafoman
10. 11. 2014   #2
-
0
-

Lebo ::MyCreate() vracia Rvalue a konstruktor XXX::XXX(XXX &inRight) ocakava Lvalue parameter. Skus vytvorit copy konstruktor XXX::XXX(const XXX &inRight)  alebo ak mas c++11/14 tak mozes pouzit move constructor XXX::XXX(XXX &&inRight) .

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV+42
God of flame
10. 11. 2014   #3
-
0
-

jop, delas hromadu kopii a kopirovaci konstruktor MUSI mit const parametr..

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jurin
~ Anonymní uživatel
16 příspěvků
10. 11. 2014   #4
-
0
-

Dík, ale v tomto případě by se copy CTOR vůbec neměl volat.

Pokud dám copy CTOR jako const referenci, tak to funguje jak má a volá se pouze tento CTOR 

XXX(int* const Ptr = 0) a copy CTOR se vůbec nevolá.

Nahlásit jako SPAM
IP: 84.242.99.–
Jurin
~ Anonymní uživatel
16 příspěvků
10. 11. 2014   #5
-
0
-

pro KIIV.

Nemusí, ale vetšinou by měl.

Toto je čístě z teoretických důvodů, proč se to takto volá. Nějak mi to nedává smysl.

Nahlásit jako SPAM
IP: 84.242.99.–
vitamin+8
Grafoman
10. 11. 2014   #6
-
0
-

#5 Jurin
Ty zrejme narazas na tzv: "copy elision". Copy ctor sa nemusi volat ak kompilator vyoptymalizuje zbytocne kopie. Ak si vypnes optimalizacie tak sa ti budu volat vsetky ctory.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Jurin
~ Anonymní uživatel
16 příspěvků
10. 11. 2014   #7
-
0
-

Já myslel, že u tohoto volání  

return XXX(new int);

je dáno standartem C++, že copy CTOR se nevolá.

Nahlásit jako SPAM
IP: 84.242.99.–
vitamin+8
Grafoman
10. 11. 2014   #8
-
0
-
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Jurin
~ Anonymní uživatel
16 příspěvků
10. 11. 2014   #9
-
0
-

Stejně mě to furt nějak neleze do hlavy.

Když tento CTOR  XXX(MyRef inRight)  ze třídy XXX vyhodím, tak se to chová jak bych čekal, tj. volá se jenom CTOR  XXX(int* const Ptr). A copy CTOR mám pořád stejně, bez const.

Když CTOR  XXX(MyRef inRight)  přidám do XXX, tak se pro mě z nějakého záhadného důvodu začne volat.

Chová se to stejně v gcc i MS VS 2010.

Nahlásit jako SPAM
IP: 84.242.99.–
KIIV+42
God of flame
10. 11. 2014   #10
-
0
-

#5 Jurin
MUSI .. jen si pridej do vypisu vypis << this << a uvidis, kolik kopii objektu ti tam prolezl, kdyz se snazil neco delat...

a jelikoz si nemel copy konstruktor (bez const & to proste neni copy konstruktor), tak to naslo, ze mas konstruktor z MyRef ... a ze u XXX zna konverzi na MyRef  .. .a tak dale... to samy potom u toho a = ...

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
10. 11. 2014   #11
-
0
-

#9 Jurin
skus si spustit toto a porozmyslat preco sa vystupy lisia:


struct Test{
	Test(){std::cout << "Test::Test()\n";}
	Test(Test& ){std::cout << "Test::Test(Test&)\n";}
	Test(int){std::cout << "Test::Test(int)\n";}
  	operator int(){std::cout << "Test::operator int()\n";}
  	~Test(){std::cout << "Test::~Test()\n";}
};


int main(){
    std::cout << "\nA:\n";{
        Test x;
        Test A = x;
    }

    std::cout << "\nB:\n";{
        Test B = Test();
    }

    return 0;
}
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Jurin
~ Anonymní uživatel
16 příspěvků
11. 11. 2014   #12
-
0
-

vitamin:

Tvůj příklad je jasný, mě celou dobu mátl MS překladač kde prochází tento kod. 

struct Test
{
	Test()
	{
		std::cout << "Test::Test()\n";
	}

	Test(Test&)
	{
		std::cout << "Test::Test(Test&)\n";
	}


	~Test()
	{
		std::cout << "Test::~Test()\n";
	}
};

int main()
{
	{
		Test B = Test();
	}

	return 0;
}

Díky všem za příspěvky.

Nahlásit jako SPAM
IP: 84.242.99.–
vitamin+8
Grafoman
11. 11. 2014   #13
-
0
-

#12 Jurin
To bude bug v prekladaci.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 77 hostů

Podobná vlákna

Přetypování — založil Pavel Synek

Přetypování — založil Keyzio

Pretypovani v C — založil TuTi_fruTi

Přetypování. — založil jisla

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý