2016-04-21 60 views
1

我的程序的想法是创建一个局部变量和调用构造函数的方式。当变量超出范围时,析构函数将被调用。所有的工作都是在Ctor和Dtor完成的。 基本上我想创建一个本地变量,我并不真正关心它并自动销毁它。这种类型声明的GCC文档int(a)

然后,我会做这样的事情:

typedef Foo DoInCtor 

之后,我会做这样的事情:

DoInCtor() 

这将创建一个局部变量,我并不真正关心。

这是类似的东西是什么我工作:

#include <stdio.h> 
#include <typeinfo> 
#include <iostream> 

class Bar 
{ 
public : 
    Bar() {printf("BAR, Default Ctor %p\n", this);} 

    ~Bar() {printf("BAR, Default Dtor %p\n", this);} 
}; 

class Foo 
{ 
public : 
    Bar m_bar; 
    Foo() : m_bar(Bar()) {printf("FOO, Default Ctor %p\n", this);} 
    Foo(Bar ref_bar) : m_bar(ref_bar) {printf("FOO, Other Ctor %p", this);} 
    ~Foo() {printf("FOO, Default Dtor %p\n", this);} 
}; 

Foo foo; 

int main() 
{ 
    Bar bar1; 
    printf("bar1 address, outside local scope : %p\n", &bar1); 
    std::cout << "Type of bar1 : " << typeid(bar1).name() << std::endl; 
    // This is some lcoal scope 
    { 
    Foo(bar1); 
    printf("bar1 address, in local scope : %p\n", &bar1); 
    std::cout << "Type of bar1 : " << typeid(bar1).name() << std::endl; 
    } 
    Foo foo1= Foo(bar1); 
    printf("foo1 address, in local scope : %p\n", &foo1); 
    return 0; 
} 

此输出我的机器上,使用g ++ 4.8.4在Ubuntu 14.04上编译如下:

BAR, Default Ctor 0x6021f1 
FOO, Default Ctor 0x6021f1 
BAR, Default Ctor 0x7ffe6808cfcd 
bar1 address, outside local scope : 0x7ffe6808cfcd 
Type of bar1 : 3Bar 
BAR, Default Ctor 0x7ffe6808cfcf 
FOO, Default Ctor 0x7ffe6808cfcf 
bar1 address, in local scope : 0x7ffe6808cfcf 
Type of bar1 : 3Foo 
FOO, Default Dtor 0x7ffe6808cfcf 
BAR, Default Dtor 0x7ffe6808cfcf 
FOO, Other Ctor 0x7ffe6808cfceBAR, Default Dtor 0x7ffe6808cfcf 
foo1 address, in local scope : 0x7ffe6808cfce 
FOO, Default Dtor 0x7ffe6808cfce 
BAR, Default Dtor 0x7ffe6808cfce 
BAR, Default Dtor 0x7ffe6808cfcd 
FOO, Default Dtor 0x6021f1 
BAR, Default Dtor 0x6021f1 

让我困扰在主要功能范围bar1中是Bar类型,但在本地范围内是Foo类型。 在我看来,这是某种类型的var声明。 我甚至尝试以下的gcc上:

int(a) 

和它创建的变量a这是int类型。

这里的问题是,如果有人可以提供我一些类型的文件,这里详细解释。一些GCC或其他文件。

+2

为什么C标签? –

+0

这只是标准的C++。您可以在声明中的标识符周围放置括号。这就是你要问的吗? – davmac

+0

是的,如果这是标准的,那就是我所问的。 我只是想知道是否有任何关于它的文档? –

回答

4

您只需创建一个局部变量,称为bar1,它覆盖main中的一个变量,并且类型为Foo。您不会使用第二个构造函数创建一个临时Foo变量。在这种情况下,允许在括号中标注名称。

可疑行相同Foo bar1;