symfonia c++ Operator const_cast
Ostatnio zmodyfikowano 2014-01-13 21:24
sic0 Temat założony przez niniejszego użytkownika |
symfonia c++ Operator const_cast » 2014-01-12 13:59:19 Witam. Jestem w trakcie nauki języka C++ przy pomocy książki Symfonia C++ standard Kraków 2008. Obecnie jestem na stronie 281 gdzie znajduje się przykład dotyczący rzutowania przy pomocy operatora const_cast. Wg. opisu autora owy operator powinien dać możliwość modyfikacji obiektu stałego niestety nie udało mi się to pomimo przepisania przykładu z książki. Po kilku próbach i nawet kilkunastu własnych modyfikacjach kody nadal nie udało mi się osiągnąć zamierzonego celu. Odnalazłem zatem już napisane przykłady do owej książki w którym również nie został zmodyfikowany obiekt stały. Pozwolę sobie wkleić tutaj kod: #include <iostream> using namespace std;
int main() { double zmienna = 0; const double stala = 3.14; double * wsk_do_zmiennej = & zmienna; const double * wsk_do_stalej = & stala; const double * wsk2_do_stalej; cout << "Na poczatku, stala = " << stala << endl; wsk2_do_stalej = wsk_do_zmiennej; wsk_do_zmiennej = const_cast < double *>( wsk_do_stalej ); * wsk_do_zmiennej = - 333; cout << "Potem =====> stala = " << stala << endl; double * const st_wsk_do_zmiennej = const_cast < double * const >( wsk_do_stalej ); wsk_do_zmiennej = st_wsk_do_zmiennej; int * wskint; wskint = reinterpret_cast < int *>( const_cast < double *>( wsk_do_stalej ) ); }
Wynik powinien wyglądać tak: Na poczatku, stala = 3.14 Potem =====> stala = -333 Moje pytania/prośby brzmią: 1) Czy w obecnej wersji standardów języka C++ nastąpiły zmiany które uniemożliwiają taką zmianę? 2) Czy jest możliwość wykonania tego w jakiś inny sposób? 3) Jeżeli wszystko jest ok tylko popełniłem jakiś błąd bądź w książce jest błąd prosiłbym o wskazanie mi go. Używam: Code::Block wersja 13.12, Windows 7 64bit. Z góry dziękuje za odpowiedź. |
|
Monika90 |
» 2014-01-12 14:15:04 Operator const_cast nie pozwala na modyfikowanie stałej, nigdy na to nie pozwalał i w ogóle nie da się tego zrobić - tzn. przy próbie zrobienia czegoś takiego zachowanie programu jest niezdefiniowane. |
|
leon_w |
» 2014-01-12 16:19:26 Autor napisał: "No, nie zawsze. Standard mówi, że taka prośba modyfikacji obiektu stałego ma "zachowanie niezdefiniowane". Dla naszego dobra niektóre kompilatory generują w tym miejscu taki kod, który mimo wszystko zachowa poprzednią wartość tego stałego obiektu. Chwała im za to. |
|
sic0 Temat założony przez niniejszego użytkownika |
kompilator » 2014-01-12 16:46:32 Przyznam, że umkneło to zdanie mojej uwadze, a czy znany jest Tobie/Wam kompilator który taką "transformację" zaakceptuje? |
|
Chlorek |
» 2014-01-12 19:17:21 Tylko po co to robić? Rozumiem, że to w formie nauki, ale nigdy i tak w żadnym programie (poza czysto testowym) czegoś takiego nie wolno robić. Const to const i tak powinno zostać. |
|
pekfos |
» 2014-01-12 20:44:41 a czy znany jest Tobie/Wam kompilator który taką "transformację" zaakceptuje? |
Nie wolno i tyle. Zabronione pod karą niedziałania programu. Jak usłyszałeś w szkole, że nie można dzielić przez zero, to też zadałeś podobne pytanie? |
|
sic0 Temat założony przez niniejszego użytkownika |
» 2014-01-13 20:27:51 Dzięki za zainteresowanie i odpowiedzi, po co? z ciekawości, ale jeżeli tego się nie praktykuje to nienalegam. |
|
Elaine |
» 2014-01-13 21:24:22 Jak usłyszałeś w szkole, że nie można dzielić przez zero, to też zadałeś podobne pytanie? |
Różnica jest taka, że dzielić przez zero czasami można. |
|
« 1 » |