我们可以在c ++

时间:2018-07-27 05:29:12

标签: c++

为什么以下代码不会引发错误:

假设我们有一个名为myclass的类。

方案1:

    for(int i=0;i<5;i++)
    {
        myclass m;
    }

方案2:

    for(int i=0;i<5;i++)
    {
        myclass m(i);
    }

假设我们也定义了单个参数构造函数。 以上两个都不抛出错误。两种情况下到底发生了什么。

2 个答案:

答案 0 :(得分:5)

变量datam,对于这种类型的变量local限于其Lifetime

  • 范围是可访问变量的代码的区域或部分

  • 生命周期是对象/变量处于有效状态的时间持续时间

变量m的作用域在for循环结束时终止,因此生命周期结束。因此,在下一次迭代的开始,Scope不再在内存中,并且不会出现由相同名称引起的冲突。

答案 1 :(得分:-2)

两种情况都可以正常工作。

第一种情况:

for(int i=0;i<5;i++)
    {
        myclass m; // default constructor will be called
                   // Memory allocation for object
        /* Some code */
        //destructor will be called at end i.e scope end
        // Memory released for the object
    }

第二种情况:

 for(int i=0;i<5;i++)
{
    myclass m(i);// parametrized constructor will be called.
                 // Memory allocation for object
    /* Some code */
    //destructor will be called at end i.e at scope end.
    // Memory released for the object
}

如果可以使用相同的内存地址为对象分配内存,则每次都可以获取相同的地址,但这不是必需的

#include <iostream>
using namespace std;

class myclass{

    public: 
    int i; 
    myclass():i(0){}
    myclass(int x):i(x){}
};

int main()
{
    for(int i=0;i<5;i++)
        {
            myclass m(8); 
            cout<<&m<<endl;
        }

    return 0;
}

输出:

0x7ffdf3daec20
0x7ffdf3daec20
0x7ffdf3daec20
0x7ffdf3daec20
0x7ffdf3daec20