C++ 实例化对象的正确方法
在Visual Studio中,如果我编写:C++ 实例化对象的正确方法,c++,C++,在Visual Studio中,如果我编写: Foo f(); f.doSomething(); Foo f = Foo(); f.doSomething(); Foo f; f.doSomething(); IDE无法识别doSomething() 但是如果我写: Foo f(); f.doSomething(); Foo f = Foo(); f.doSomething(); Foo f; f.doSomething(); VisualStudio可以识别此对象。引用C++标准,
Foo f();
f.doSomething();
Foo f = Foo();
f.doSomething();
Foo f;
f.doSomething();
IDE无法识别doSomething()
但是如果我写:
Foo f();
f.doSomething();
Foo f = Foo();
f.doSomething();
Foo f;
f.doSomething();
VisualStudio可以识别此对象。引用C++标准,第一种方法应该是完全好的,不是吗?< < /p> < p>语句<代码> fo f-);是一个函数声明,而不是类型为Foo
的局部变量f
的声明。要使用无参数构造函数声明本地Foo
值,必须省略()
语句foof()
是一个函数声明,而不是类型为Foo
的局部变量f
的声明。要使用无参数构造函数声明本地Foo
值,必须省略()
这是一种称为的形式。如果要使用默认构造函数实例化自动变量,则无需使用()
如果需要调用其他构造函数,请使用()
:
或更新的初始化语法(C++11):
详细信息
Scott Meyers在“有效STL”的第6项中谈到了这一点。C++的基本规则是,如果一行可以解析为函数声明,它将是。这意味着以下两行都被解析为函数声明,而不是变量实例化:
Foo f(); // declares a function f that takes no parameters and returns a Foo
list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>()); // declares a function that takes 2 istream_iterators and returns a list<int>
Foo f();//声明一个不接受任何参数并返回Foo的函数f
列出数据(istream_迭代器(数据文件),istream_迭代器());//声明一个接受2个istream_迭代器并返回列表的函数
这是一种称为的形式。如果要使用默认构造函数实例化自动变量,则无需使用()
如果需要调用其他构造函数,请使用()
:
或更新的初始化语法(C++11):
详细信息
Scott Meyers在“有效STL”的第6项中谈到了这一点。C++的基本规则是,如果一行可以解析为函数声明,它将是。这意味着以下两行都被解析为函数声明,而不是变量实例化:
Foo f(); // declares a function f that takes no parameters and returns a Foo
list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>()); // declares a function that takes 2 istream_iterators and returns a list<int>
Foo f();//声明一个不接受任何参数并返回Foo的函数f
列出数据(istream_迭代器(数据文件),istream_迭代器());//声明一个接受2个istream_迭代器并返回列表的函数
no,第一个是函数声明。请尝试Foo f代码>或Foo f{}代码>这是C++的一个怪癖。莱瓦瑟:这个问题是最令人烦恼的。这是一个类似的问题,但它不是MVP。@H2CO3正如我在下面所说的,它实际上是MVP的一种形式。Meyers在“effectiveSTL”中以这种情况为例进行了讨论。不,第一个是函数声明代码>或Foo f{}代码>这是C++的一个怪癖。莱瓦瑟:这个问题是最令人烦恼的。这是一个类似的问题,但它不是MVP。@H2CO3正如我在下面所说的,它实际上是MVP的一种形式。Meyers在“effectiveSTL”中以这种情况为例进行了讨论。那么我该如何使用参数调用构造函数呢?特别是当我将它们声明为成员函数并希望在类的构造函数中初始化它们时。这将导致双重初始化,对吗?第一个在foof代码>和第二个在f=Foo(int-param)处代码>如果构造函数中没有参数,请不要使用括号。否则使用括号中的参数。@user3067395f=Foo(int-param)代码>不是构造对象的方式(这是另一个函数声明)。你的意思肯定是f=Foo(param)代码>?那么如何使用参数调用构造函数?特别是当我将它们声明为成员函数并希望在类的构造函数中初始化它们时。这将导致双重初始化,对吗?第一个在foof代码>和第二个在f=Foo(int-param)处代码>如果构造函数中没有参数,请不要使用括号。否则使用括号中的参数。@user3067395f=Foo(int-param)代码>不是构造对象的方式(这是另一个函数声明)。你的意思肯定是f=Foo(param)代码>?这不是最烦人的解析。它只是一个函数声明。您链接到的页面给出了几个最麻烦的解析示例,但这不是其中之一。@PeteBecker不正确。它是MVP的一种形式:、等intf()
是一个函数声明,从C开始就一直存在。它没有什么令人烦恼的。如果你阅读最初链接到的页面,你会发现“最麻烦的解析”要复杂得多,结果不仅出乎意料,而且一点用处都没有。是的,如果赫伯这么说,那一定是绝对的、无可争辩的事实。他从不过分简化任何事情。写intf
定义一个对象并intf()代码>定义函数?是的,“最麻烦的解析”来自于使intf()的规则代码>一个函数声明(它做了一些事情),但这并不让它烦恼。初学者也没有弄错;一旦解释好了,他们就不会有问题了,不像你第一次引用的维基百科页面上令人困惑的解析示例,这不是最麻烦的解析。它只是一个函数声明。您链接到的页面给出了几个最麻烦的解析示例,但这不是其中之一。@PeteBecker不正确。它是MVP的一种形式:、等intf()
是一个函数声明,从C开始就一直存在。它没有什么令人烦恼的。如果你阅读了最初链接到的页面,你会发现“大多数人”都是