3.const_cast\nconst定义的常变量是不能进行重新赋值的,但是如果我们使用const_cast让一个指针指向一个const变量所在的空间,就可以通过指针来修改;对应的是C语言的强制类型转换。\n\nconst int a = 10;\nint* pa = const_cast\u003Cint*>(&a);\n*pa = 20;\ncout \u003C\u003C a \u003C\u003C endl; //10\ncout \u003C\u003C *pa \u003C\u00endl;//20\n1\n2\n3\n4\n5\n\n\npa中存储的是a的地址,*pa和a打印出来的值理论上来说是一样的,那为什么打印的值不一样?\n\n解答:const修饰的常变量,编译器会做出一些优化,如直接放在寄存器中,或者是定义成一个宏;在流插入时a不会去内存中去取,而是直接找到寄存器或者宏,所以打印的还是10;而*pa会去内存中找,所以打印的是20。\n\n4.dynamic_cast\n父类指针或引用可以指向子类的指针或引用,但是如果直接使用子类指针或引用指向父类的指针或引用就会报错。\n\n注意:父类对象是无论如何都无法转换成子类对象的。\n\nclass A\n{\npublic:\n\tvirtual void f() {}\n};\nclass B : public A\n{};\n\nint main()\n{\n A aa;\n\tB bb;\n\tbb = aa;\n\tbb = (B)aa;\n\tbb = dynamic_cast\u003CB>(aa);\n return 0;\n}