我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.
我们最近的分歧是关于将"const"放在声明上的样式问题.
他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:
const int *i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.
因此,指向常量int的指针和指向int的常量指针将分别为:
int const * i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:
int * const * i;
Run Code Online (Sandbox Code Playgroud)
我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.
这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.
编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?
给定
int i = 42;
int* p = &i;
Run Code Online (Sandbox Code Playgroud)
我们做不到
const int * & d = p;
Run Code Online (Sandbox Code Playgroud)
在我目前的理解中,这是因为const int * & d可以读作“d是一个指向 an 的指针的引用int,它是一个const”,并且p是“指向 an 的指针int”,这意味着 RHS 需要变成一个临时的“指向 an 的指针”。 anint是一个const" 并且不能直接与引用绑定(如在 LHS 上)。我们需要有,比如说,const int* const& d = p;。可能的参考文献:1、2。
也就是说,请考虑以下玩具代码:
template<typename T>
class X
{
public:
void fun(const T& d) { }
};
Run Code Online (Sandbox Code Playgroud)
起初我想如果我这样做
X<int*> x;
x.fun(p); …Run Code Online (Sandbox Code Playgroud) 我在一个流行的C ++博客中遇到了以下代码:
double const x = 1.0;
Run Code Online (Sandbox Code Playgroud)
我知道这一点const double*,double* const不同之处在于前者的值是const,而其他的指针是const。但是double const和之间有什么区别const double?
int x = 10;
int * const p = &x;
const int **p1 = &p;
Run Code Online (Sandbox Code Playgroud)
难以理解为什么这是非法的.
编辑
谢谢你所有的好答案.以下是我对答案的解释,随意不同意.所以,错误在第3行.它意味着原始整数是常量但并不意味着它指向的指针是常量,因此它是非法的,因为我们可以尝试将指针"p"改变为"p1",这是不可能的,因为这是一个常量指针.所以要解决这个问题,第三行必须是:
int * const *p1 = &p;
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为它表示虽然原始整数是非常量(可变),但它指向的指针是常量,因此它是一个合法的陈述.所以这也是合法的:
const int * const *p1 = &p;
Run Code Online (Sandbox Code Playgroud)
这说同样的事情,除了它还说你不能改变原始整数,因为它是不变的.
我在函数参数中使用pass引用传递给const字符串,如下所示:
class Super
{
void alignment(const string & str);
};
void Super::alignment(const string & str)
{
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
现在如果我使用如下,它会得到相同的结果:
void Super::alignment(string const & str)
{
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
这两种c ++定义有什么区别?
喜
我想知道C中"int const*"的确切含义,以及嵌入式编程系统中"const int*"和"int const*"之间的小比较.
__kanu
无法知道为什么输出是6?在给定的C程序中,我每次输出为6,所以我不能说它是打印Garbage值
#include<stdio.h>
void main()
{
int const* a=2;
printf("%d\n",++(a));
}
Run Code Online (Sandbox Code Playgroud)
我无法确定为什么这个C程序给了我这个答案.
我正在使用c谜题,并遇到了这个问题.在这里,一个at printf语句指针增加一次,所以我认为它将指向随机数!但我不明白为什么25是输出?谁有人可以帮我理解?提前谢谢了;)
void main()
{
int const * p=5;
printf("%d",++(*p));
}
Run Code Online (Sandbox Code Playgroud)
答案:25