我的类中有一个私有变量Student定义为:
const int studentNumnber;
Run Code Online (Sandbox Code Playgroud)
我正在尝试为学生编写一个复制构造函数,我需要抛弃constness来执行此操作,遗憾的是我不明白如何使用std::const_cast.
这是我在我的复制构造函数中尝试做的事情:
Student(const Student & s)
: Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0), studentNumber(0) {
school = new char[strlen(s.school) + 1];
strcpy_s(school, strlen(s.school) + 1, s.school);
const_cast<int*>(this)->studentNumber = s.studentNumber;
//studentNumber = s.studentNumber);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用......我不确定这样做的语法是什么.
int main()
{
const int ia = 10;
int *pia = const_cast<int*>(&ia);
*pia = 5;
std::cout << &ia << "\t" << pia <<endl;
std::cout << ia << "\t" << *pia <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0x28fef4 0x28fef4
10 5
Run Code Online (Sandbox Code Playgroud)
*pia并ia具有相同的地址,但它们具有不同的值.我的目的是用来const_cast修改一个常量值,但结果显示它不起作用.
有谁知道为什么?
考虑一下:
#include <iostream>
using namespace std;
int main(void)
{
const int a1 = 40;
const int* b1 = &a1;
char* c1 = (char *)(b1);
*c1 = 'A';
int *t = (int*)c1;
cout << a1 << " " << *t << endl;
cout << &a1 << " " << t << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个输出是:
40 65
0xbfacbe8c 0xbfacbe8c
Run Code Online (Sandbox Code Playgroud)
除非编译器进行优化,否则这对我来说几乎是不可能的.怎么样 ?
我有以下代码:
const int k=1;
int *p=const_cast<int *>( &k);
cout<<"k before="<<*p<<endl;
*p=10;
*const_cast<int *>( &k)=12;
cout<<"k after="<<k<<endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
k before=1
k after=1
Run Code Online (Sandbox Code Playgroud)
为什么const const不在这里工作?
这是我的问题,问题出在评论中
const int a = 5;
const_cast<int&>(a)=7; //throw over const attribute in a,and assign to 7
std::cout<<a<<std::endl; //why still out put 5!!!!!!!!!!
Run Code Online (Sandbox Code Playgroud)
谁可以告诉我为什么,有些书籍会考虑这些问题来推荐?谢谢!
我知道使用const_cast通常是坏主意,但我正在玩它,我遇到了一个奇怪的行为,其中:
两个指针具有相同的地址值,但在取消引用时,给出不同的数据值.
有没有人对此有解释?
码
#include <iostream>
int main()
{
const int M = 10;
int* MPtr = const_cast<int*>(&M);
(*MPtr)++;
std::cout << "MPtr = " << MPtr << " (*MPtr) = " << (*MPtr) << std::endl;
std::cout << " &M = " << &M << " M = " << M << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
产量
MPtr = 0x7fff9b4b6ce0 (*MPtr) = 11
&M = 0x7fff9b4b6ce0 M = 10
Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
int main() {
const int a = 10;
auto *b = const_cast<int *>(&a);
*b = 20;
cout << a << " " << *b;
cout << endl << &a << " " << b;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
10 20
0x7ffeeb1d396c 0x7ffeeb1d396c
Run Code Online (Sandbox Code Playgroud)
该a和*b是在同一个地址,为什么他们有不同的价值?
int main()
{
const int maxint=100;//The program will crash if this line is put outside the main
int &msg=const_cast<int&>(maxint);
msg=200;
cout<<"max:"<<msg<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果'const int maxint = 100;',该函数将运行正常.定义被放在main函数内但崩溃并弹出一条错误消息,如果放在外面则说"Access Violation".
有人说这是某种"未定义的行为",我想知道确切的答案以及如何安全地使用const转换?
我有以下代码:
int main(){
const int a = 1;
const int* b(&a);
int* c = const_cast<int*>(b);
*c = 29;
cout<<*c<<a<<*b;
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
为什么'a'的值不变为29?这是否意味着当const_casting b时,a的常量不会被删除?
#include <iostream>
using namespace std;
int main() {
const int a = 2;
const int *p = &a;
int *p2 = const_cast<int*>(p);
*p2=5;
char *p3 = (char *)&a;
cout << "p2 is" << *p2 << endl;
cout << "p2 address " << p2 << endl;
cout << "a is " << a << endl;
cout << "a address " << &a << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
大家好!
根据输出,*p2和a具有不同的值,*p2是5,a是2.
但是,p2和&a是相同的.我糊涂了...
你能帮我理解一下这种情况吗?
非常感谢你!