显式赋值与隐式赋值 我正在阅读C++教程,但实际上这并没有给我两个不同的语法(除了语法)。以下是本教程的一段引文

显式赋值与隐式赋值 我正在阅读C++教程,但实际上这并没有给我两个不同的语法(除了语法)。以下是本教程的一段引文,c++,implicit,explicit,C++,Implicit,Explicit,您还可以在声明时为变量赋值。当我们 使用赋值运算符(等于)为变量赋值 符号),称为显式赋值: int nValue = 5; // explicit assignment int nValue(5); // implicit assignment 还可以使用隐式赋值为变量赋值: int nValue = 5; // explicit assignment int nValue(5); // implicit assignment 尽管隐式赋值看起来很像函数调用,但是 编译器跟踪哪些名称是

您还可以在声明时为变量赋值。当我们 使用赋值运算符(等于)为变量赋值 符号),称为显式赋值:

int nValue = 5; // explicit assignment
int nValue(5); // implicit assignment
还可以使用隐式赋值为变量赋值:

int nValue = 5; // explicit assignment
int nValue(5); // implicit assignment
尽管隐式赋值看起来很像函数调用,但是 编译器跟踪哪些名称是变量,哪些是变量 函数,以便可以正确解析它们


有区别吗?一种类型比另一种类型更可取吗?

第一种类型与
int
等基本类型一起可取;第二种方法使用具有构造函数的类型,因为它使构造函数调用显式

例如,如果您定义了一个可以从单个
int
构建的
类Foo
,则

Foo x(5);
优先于

Foo x = 5;

(当传递多个参数时,无论如何都需要前面的语法,除非使用
foox=Foo(5,“hello”);
,它非常难看,看起来像是调用了
操作符=

当声明变量并初始化它时,它们在该上下文中的功能是相同的。我通常将两者称为:

int nValue = 5; // assignment syntax

对于基本类型,我更喜欢赋值而不是构造,因为它更自然,特别是对于那些用其他语言编程的人


对于类类型,我更喜欢构造语法,因为它避免了构造函数的存在。

对于基本类型,两者都是等效的,对于用户定义的类类型,两者是不同的。在这两种情况下,执行的代码都是相同的(在执行基本优化之后),但是如果我们从中初始化的元素不是我们正在构造的类型,则对类型的要求不同

复制初始化(
T=u;
)相当于从类型为
T
的临时文件复制构造,该临时文件已从
u
隐式转换为
T
。另一方面,直接初始化相当于直接调用适当的构造函数

虽然在大多数情况下没有区别,但如果采用
u
的构造函数被声明为
explicit
,或者复制构造函数不可访问,则复制初始化将失败:

struct A {
   explicit A( int ) {}
};
struct B {
   B( int ) {}
private:
   B( B const & );
};
int main() {
   A a(1);      // ok
   B b(1);      // ok
// A a2 = 1;    // error: cannot convert from int to A
// B b2 = 1;    // error: B( B const & ) is not accessible
}

对于某些历史背景,最初的基元类型必须使用复制初始化进行初始化。当将*initializer list*s添加到语言中以从类初始化成员属性时,决定使用与类相同的语法初始化基元类型,以保持initializer list中的语法统一和简单。同时,允许通过复制初始化来初始化类,这使得用户定义的类型更接近基本类型。两种初始化格式之间的差异是自然而然的:
inta=5.0作为从
5.0
int
的转换处理,然后从
int
初始化
a
。用户定义的类型也是如此:
tu=v作为从
v
T
的转换处理,然后从转换后的值复制
u
的结构。

这不是声明,而是定义。抛开那个教程吧。C++中的思维是免费的,可以从作者的页面中获得。@ CAT Plus Plus:它是一个定义,但这并不意味着它不是一个声明。@ JAMESMCNELIS:它应该是一个教程,调用定义声明并不能帮助消除两者之间的混淆。也许我今天只是脾气暴躁P@Cat加上:说某些东西不是它实际上是什么也无助于消除混淆。讨论中的教程是这样的:标准(N3242)调用语法
tx=a
复制初始化和
tx(a)
直接初始化。这两种方法都是调用构造函数
T::T(a)
的有效方法。值得一提的是,使用构造语法时,您需要小心大多数令人烦恼的语法分析。还要注意的是
Foo x=5
仅在
Foo::Foo(int)
未标记为
explicit
的情况下才有效。。。。(继续@Vitus comment)和
Foo
copy构造函数可访问。