为什么我们可以在C ++的构造函数中使用声明的变量

时间:2014-02-25 03:35:00

标签: c++ constructor declaration

由于这种代码,我最近遇到了一些奇怪的错误。

vector<int> a(a);

为什么接受上面的代码?什么时候需要? 如何要求编译器禁止这种用法? 谢谢。

2 个答案:

答案 0 :(得分:6)

最常见的用例实际上是C语言,而不是C ++(你不应该在C ++中使用malloc,尽管你可以),但在这种情况下C ++是向后兼容的:

mytype *p = malloc(sizeof *p);

允许在初始值设定项表达式中使用p,您可以将sizeof *p传递给malloc,确保无论mytype的大小是多少,正确的大小都将是分配。如果您不允许执行*p,那么上面的表达式必须具有类型mytype两次,稍后代码中的维护可能会更新其中一种类型而无法更新另一种类型。 / p>

答案 1 :(得分:2)

这是一个实际使用的不寻常的构造,但是如果一个类有一个构造函数由于某种原因引用某个其他对象,并且调用者可能想要将该对象循环到它自己的初始化中它会很有用

这是一个人为的例子:

#include <iostream>
using namespace std;

struct PrintAnAddress {
    PrintAnAddress()
        : msg_("")
        , addr_(NULL)
    { }
    PrintAnAddress( char const *msg, PrintAnAddress const &that )
        : msg_( msg )
        , addr_( &that )
    { }
    void operator()( ostream &os ) const {
        cout << msg_ << addr_ << endl;
    }
private:
    char const *msg_;
    PrintAnAddress const *addr_;
};

int main() {
    PrintAnAddress p1;
    PrintAnAddress p2( "p1:", p1 );
    PrintAnAddress p3( "self:", p3 );
    p1(cout);
    p2(cout);
    p3(cout);
}

定义p2时,设置为打印p1的地址,但定义p3时,设置为打印自己的地址。如果p3变量尚未在范围内,则无法引用它以便在初始化时传递它。 (至少,不是没有检测类并以某种方式访问​​this指针。)

我确信这个构造有一些有用且有效的应用程序,但正如我所说,这很不寻常,所以现在没有人想到。