2个简单变量初始化问题

时间:2011-07-05 09:12:14

标签: c++

  

可能重复:
  Is there a difference in C++ between copy initialization and direct initialization?

之间有什么区别,

int x(5);
int x = 5;

&安培;有什么区别,

int const x(5);
const int x(5);

8 个答案:

答案 0 :(得分:4)

在您显示的4行中,只有1行是有效的C.

int x(5);        /* INVALID C */
int x = 5;
int const x(5);  /* INVALID C */
const int x(5);  /* INVALID C */

我不知道其他语言中无效行的含义。在C中,有效行的含义是创建名为x,类型为int和值为5的对象。


要定义“const”(更好:“只读”)对象,C语法是

const int x = 5;
int const x = 5;

x不能用于只允许常量的地方。 x不是常数:它是const int

类型的对象
#define CONSTANT 42
enum /*unnamed*/ { First=1, Second, Third };
switch (var) {
    case x: break; /* invalid use of x; only constants allowed in case labels */
    case 15: break; /* ok; 15 is a constant */
    case CONSTANT: break; /* ok; CONSTANT is a constant with value 42 */
    case Second: break; /* ok; Second is a constant with value 2 */
}

答案 1 :(得分:2)

首先,内置类型没有区别。对于类类型,T x = y表示法需要复制构造函数,T x(y)表示法不需要。{1}}表示法。 编辑:另外,正如其中一位评论者指出的那样,如果T x = y构造函数被声明为T(y),则explicit将无效。

对于第二种,就编译器而言没有区别,但第二种(const int)在许多情况下会导致混淆,尤其是涉及typedef时,例如:< / p>

typedef int* IntPtr;
IntPtr const cpi1;  //  Const pointer to a non-const int.
const IntPtr cpi2;  //  Also a const pointer to a non-const int.

在两个定义中,const适用于指针。

由于这种混淆,将const置于其修改之后通常被认为是更好的做法。现在 - 很长一段时间,将const置于开头是很平常的,结果是这种做法很普遍。

答案 2 :(得分:2)

关于const的一个非常好的经验法则:

  

从右到左阅读声明。

(参见Vandevoorde / Josutiss“C ++模板:完整指南”)

例如:

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

自从我遵循这个经验法则后,我再也没有误解过这样的声明。

(:sisab retcarahc-rep a no ton,sisab nekot-rep a tfel-ot-thgir naem I hguohT:tidE

答案 3 :(得分:1)

在使用参数之前,两者都不完全相同。这只是编码风格的问题。

[注意:但是以下不一样:

int x;  // x is variable
int x();  // x is function declaration

答案 4 :(得分:1)

关于const关键字:

  • 它使const立即成为 left
  • 如果左侧没有任何内容,则它适用于右侧

因此,int const iconst int i是相同的。

但是,int *const iconst int *i不相同:在第一个表达式中,指针是常量,在第二个表达式中,指向的整数是常量。 Als int const* i相当于第二个。

答案 5 :(得分:0)

没有区别。将变量初始化为值的替代方法。

但是你在你的系统上尝试过这个吗?你得到了什么?

答案 6 :(得分:0)

c ++中没有区别,但是 - int x(5);是不允许的

答案 7 :(得分:-1)

int x(5);
int x = 5;

没有区别。

int const x(5);
const int x(5);

没有区别。

int x = 5;
const int *p = &x;
int *const q = &x;

以下是pq的区别。使用p您无法更改x的值,但您可以为p分配新地址。使用q,您无法指向任何其他内存位置,但您可以使用x修改q