我有一篇文章,但我失去了它.它展示并描述了一些人们应该小心的C/C++技巧.其中一个让我感兴趣,但现在我正在尝试复制它,我无法将其编译.
这个概念是可以随意改变constC/C++ 中a的值
它是这样的:
const int a = 3; // I promise I won't change a
const int *ptr_to_a = &a; // I still promise I won't change a
int *ptr;
ptr = ptr_to_a;
(*ptr) = 5; // I'm a liar; a is now 5
Run Code Online (Sandbox Code Playgroud)
我想向朋友展示这个,但现在我错过了一步.有谁知道它开始编译和工作缺少什么?
ATM我从'const int*'到'int*'的转换无效,但是当我读到我试过的文章时,它运行得很好.
有人问我怎样才能改变const变量的值.
我明显的回答是"指针!" 但我尝试了下一段代码,我很困惑......
int main()
{
const int x = 5;
int *ptr = (int *)(&x); // "Cast away" the const-ness..
cout << "Value at " << ptr << ":"<< (*ptr) <<endl;
*ptr = 6;
cout << "Now the value of "<< ptr << " is: " << (*ptr) <<endl;
cout << "But the value of x is still " << x <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Value at <some address> :5
Now the value of <same address> is: 6 …Run Code Online (Sandbox Code Playgroud) 今天我接受了一次采访,其中一个问题对我来说非常棘手.采访者说"如何不断改变其价值?"
我回答"使用指针",我向他展示了一个例子:
int main( void )
{
const int a = 3;
int *ptr;
ptr = (int*)( &a );
printf( "A=%d\n", a );
*ptr = 5;
printf( "A=%d\n", a );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但他说这很好.但告诉我哪个属性使得常数不变?他还说,有一个属性我们可以改变,并使其不断变化.
有没有这样的财产?它是如何工作的?
我试图写下一些我对多线程/并发场景感兴趣的数据结构的实现.
很多功能性的语言,几乎所有我知道的,设计自己的数据结构,以这样的方式,他们是不变的,所以这意味着如果你要添加value到一个实例t1的T,你真正得到的新实例T那包t1 + value.
container t;
container s = t; //t and s refer to the same container.
t.add(value); //this makes a copy of t, and t is the copy
Run Code Online (Sandbox Code Playgroud)
我在C++ 11中找不到合适的关键字; 标准库中有关键字,语义和函数,它们明确地面向功能方法,特别是我发现:
mutable它不是运行时,它更可能是编译器的提示,但是这个关键字并不能真正帮助您设计新的数据结构或以不可变的方式使用数据结构swap 对临时工作不起作用,这对我来说是一个很大的缺点我也不知道其他关键字/功能对这种设计有多大帮助,swap其中一个真的很接近好东西,所以我至少可以开始写东西,但显然它只限于lvalues.
所以我问:用C++ 11 设计不可变的数据结构是否可行?
我知道使用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<stdio.h>
int main()
{
const int a=1;
int *p=(int *)&a;
(*p)++;
printf("%d %d\n",*p,a);
if(a==1)
printf("No\n");//"No" in g++.
else
printf("Yes\n");//"Yes" in gcc.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出No如在输出g++汇编和Yes在gcc编译.任何人都能解释一下这背后的原因吗?
在C++中,可以const &改变的价值吗?
好吧,当然不能改变,可以吗?这const意味着什么.而且,听听Stroustrup:
甲
const左值参考指的是恒定的,这是从视角的参照的用户的点不可变的.
但是这个怎么样?
#include <iostream>
int main() {
int a = 0;
const int& r = a;
const int old_r = r;
++a;
const int new_r = r;
std::cout
<< "old_r == " << old_r
<< " but new_r == " << new_r << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这输出,old_r == 0 but new_r == 1.
这是我真正的问题.在上面的代码中,查看该行
const int new_r = r;
Run Code Online (Sandbox Code Playgroud)
只要
&new_r既不在此行也不在代码的其他地方提取volatile,没有任何东西阻止优化编译器从合并old_r …
我知道我们在 C 中以这种方式更改 const 变量值(通过将其更改为非常量)。
#include<stdio.h>
#include<stdlib.h>
int main()
{
const int var = 10;
int *ptr = &var;
*ptr = 5;
printf("var = %d\n", var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++ 中的类似事情(使用指针)给了我一个编译错误
如何更新 C++ 中的 const 变量值?
如何正确地将此代码从 Java 重写为 C++:
final int number = scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)
我正在尝试,const number << cin;但它不起作用。
数量应该是恒定的。
在 C++ 中可能吗?