Предыдущий пост -

Задача 1, Страуструп 11 глава

Рубрика: C++, Дата: 20 March, 2013, Автор:
Tags:

В следующей программе определите какие преобразования выполняются в каждом предложении?

Вот смотрите саму программку:

Я от ее решил в задаче просто за комментировал, что и где срабатывает:

//kakie preobrazovani9 vupoln9yutc9 v kajdom vurajenii?
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;

struct X
{
	int i;
	X(int){cout <<"kon X"<<endl;};//konctryktor preobrazovani9
	X operator+(int){cout <<"+ X"<<endl;}//b+c; bydet vuzuvatc9, gde b type X, a c type int
};

struct Y
{
	int i;
	Y(X){cout <<"kon Y"<<endl;};//konctryktor preobrazovani9 iz type X
	Y operator+(X){cout <<"+ Y"<<endl;}//b+c; bydet vuzuvatc9, gde b type Y, a c type X
	//operator preobrazovani9 tipa
	operator int(){}//b=c; bydet vuzuvatc9, ecli b type int, a c type Y (ne9vnoe privedenie)
};

//peregryzka mnojitel9 * //extern oznachaet chto opredelenie bydet dano pojje
extern X operator*(X,Y);//b*c; bydet vuzuvatc9, ecli b type X, a c type Y
//ob69vlenie fynkcii f prinimaet ob6ekt type X, return type int
extern int f(X);

//ob69vlenie global6nux peremennux
X x=1;//vuzovetc9 X(int); ne crabotaet potomy chto nety operator=(int)
Y y=x;//vuzovetc9 Y(int); tak je camo ne crabotaet nety operator=(X)
int i=2;//crabotaet int ocnovnoi type

int main()
{
	i+10;//crabotaet i.operator+(10);// ckajem tak kak bu vuzuvaetc9
	//y+10;//y.operator+(10), takogo nety znachit ne crabotaet
	//y+10*y;//y.operator+(10*y) нету для 10*у функции, поэтому не сработает
	//y ne9vno privedetc9 k int (operator int())
	x+y+i;//x.operator+(y.operator int()).operator+(i).
	//crabotaet konctryktor Y(X) x privedetc9 k Y, vuzovetc9 operator*
	x*x+i;//a zatem operator+.
	//crabotaet vuzovetc9 ne9vno konctryktor X(int), a zatem fynkci9
	f(7);
	//f(y);//ne crabotaet, y v tip x nechem perevecti
	y+y;//crabotaet no 9 nipoimy choto nichego ne proicxodit
	106+y;//vuzovetc9 operator int(), dl9 preobrazovani9 v int
}

int f(X a)
{
	return 1;
}

X operator*(X a,Y b)
{
	return a;
}

Я конечно не профи мб и ошибаюсь хз но вообщем, что получилось, то получилось. Смотрите разбирайтесь.

Еще решая эту задачу я подметил, что двойного преобразования автоматически не происходит, то есть возьмем к примеру выражение y+10; оно как оказалось не срабатывает потому, что у нас только operator+(Y) нету int, но int мы можем привести к X, вызвав X(10), а Х уже привести к Y вызвав Y(X), а затем уже вызвать сам перегруженный ‘+’ operator+(Y), но как мы видим двойного вызова не происходит. Ну и фиг с ним.

 

rss