
Вот посмотрите код пожалуйста
Код: Выделить всё
#include <iostream>
int main()
{
const int a=10;
const int* cp=&a;
int* p=const_cast<int*>(cp);
*p=15;
std::cout<<a<<std::endl;
return 0;
}
Я просто не понимаю почему output: 10 а не 15
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Код: Выделить всё
#include <iostream>
int main()
{
const int a=10;
const int* cp=&a;
int* p=const_cast<int*>(cp);
*p=15;
std::cout<<a<<std::endl;
return 0;
}
Код: Выделить всё
11: const int a=10;
00401798 mov dword ptr [ebp-4],0Ah
12: const int* cp=&a;
0040179F lea eax,[ebp-4]
004017A2 mov dword ptr [ebp-8],eax
13:
14: int* p=const_cast<int*>(cp);
004017A5 mov ecx,dword ptr [ebp-8]
004017A8 mov dword ptr [ebp-0Ch],ecx
15: *p=15;
004017AB mov edx,dword ptr [ebp-0Ch]
004017AE mov dword ptr [edx],0Fh
16:
17: std::cout<<a<<std::endl;
004017B4 push offset @ILT+195(std::endl) (004010c8)
004017B9 push 0Ah
004017BB mov ecx,offset std::cout (0047c0c0)
004017C0 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >: :o perator<<) (004010ff)
004017C5 mov ecx,eax
004017C7 call @ILT+475(std::basic_ostream<char,std::char_traits<char> >: :o perator<<) (004011e0)
18:
19: return 0;
004017CC xor eax,eax
2005-ой студии под рукой нет, но, если не ошибаюсь, нужно найти в главном меню Debug -> Windows -> Disassembly. В 6-й студии несколько по-другому: View -> Debug Windows -> Disassembly." писал(а):Спасибо, все понятно, а как открыть дизассемблинг кода? У меня VS2005.
Статическое поле не принадлежит объекту класса, а разделяется всеми объектами этого класса, поэтому в конструкторе, который вызывается для каждого объекта в отдельности, естественно инициализировать такое поле неправильно. Статики класса инициализируются следующим образом:" писал(а):Почему компилятор не дает возможности иницилизировать не константную статическую переменную класса, в классе? Есть в этом смысл?
Код: Выделить всё
class A
{
// ...
static int sm_i;
// ...
};
int A::sm_i = 0;
Код: Выделить всё
class A
{
// ...
static int sm_i=0;
// ...
};
Код: Выделить всё
0 = static int sm_i;