我在教科书和论坛上看到很多人在for
循环中使用赋值操作符而不是初始化操作符来开始重复执行。例如,
for ( int i = 0; i < 5; ++i ) // common
for ( int i(0); i < 5; ++i ) // uncommon
我知道初始化变量比赋值快。为什么人们更喜欢前者而不是后者?
我在教科书和论坛上看到很多人在for
循环中使用赋值操作符而不是初始化操作符来开始重复执行。例如,
for ( int i = 0; i < 5; ++i ) // common
for ( int i(0); i < 5; ++i ) // uncommon
我知道初始化变量比赋值快。为什么人们更喜欢前者而不是后者?
在C++中,int i = 0;
和int i(0);
都可以声明、定义和初始化一个值为0
的整数对象。它们是完全等价的,两种循环结构也是如此。请注意,在C语言中,int i(0);
不是一种合法的结构。
for (i = 0; i < 5; ++i)
。 - ouahint i();
不声明变量,但是int i{};
会),以及对于std :: vector
等类来允许从元素列表进行初始化。 - Mike Seymourfoo<3 > 2>
是最令人困惑的解析的一个例子吗? - Lightness Races in Orbit你提到的两种初始化方式是:
T t = u; _1
T t(u); _2
_1
这可能涉及到两个调用。一个是转换构造函数,另一个是复制构造函数。虽然大多数编译器可以省略复制构造。
_2
这只需要调用一个转换构造函数。
因此,_2比_1更好。对于内置类型,不会有太大的区别。
T t(u);
的构造函数,在这种情况下,T t=u;
不会涉及到两次调用。它将调用构造函数或复制构造函数之一。否则,请提供一个示例,我将撤销投票。我刚试过了gcc。 - kiranpradeep_1
的复制构造函数。如果选择省略复制,则可能不会调用该函数,因为这是允许优化的情况之一(从相同类型的临时对象初始化对象)。在 _2
中进行直接初始化不会调用复制构造函数。答案对于类类型是正确的;正如它所说,对于简单类型来说几乎没有区别。 - Mike Seymour-fno-elide-constructors
标志,这会调用两个构造函数。 - kiranpradeep你也可以这样写:
int i(5);
或者
int i{5};
或者
int i=5;
for( i=0 ; i<5 ; ++i )
。因此,经常使用这种语言的人可能不习惯这种类型的赋值,在C++中也可能如此,或者只是不想让初学者读者感到困惑。for( int i=0 ; i<5 ; ++i )
和for ( int i(0); i < 5; ++i )
是一样的,因为在两种情况下,变量都是在循环的第一次迭代之前创建的。int i; for(i=0 ; i<5 ; ++i );
它也会在第一个循环之前被创建,但是它是不同的。这两个版本之所以相同是因为标准规定 int i = 0;
和 int i(0);
是复制构造函数的等效调用。 - luk32for( i=0 ; i<5 ; ++i )
是明显错误的,除非你是来自上个世纪的时空旅行者。C99允许使用for ( int i=0 ; i<5 ; ++i )
,对于任何C程序员来说,这更符合习惯用法。 - user2005819
int i = 0
是初始化(尽管使用了=
),而i = 0
才是赋值。当你在同一行声明变量时,它是初始化,而不是赋值。 - jalfimage1(image2)
这样的结构在不同的上下文中可能具有不同的含义。它可以是一个函数调用或一个构造函数。你的例子看起来像是一个函数调用和赋值运算符。如果你在前面加上类型(T image(image2);
或T image = image2;
),它们都会变成复制构造函数(当然,前提是两个图像都是相同类型的T
)。 - luk32