求教 构造 和析构的 调用顺序有关问题
求教 构造 和析构的 调用顺序问题。
class F
{
int n;
int d;
public:
F(int n=0, int d=1);
F(const F& f);
~F();
};
F::F(int n, int d):n(n),d(d)
{
cout << this << "创建一个对象,其成员变量是:" << n << ' ' << d << endl;
}
F::F(const F& f):n(f.n),d(f.d+1)
{
cout << this << "创建形参对象" << n << d <<endl;
}
F::~F()
{
cout << this << "对象释放~F()" << n << '/' << d << endl;
}
F func(F x)
{
return x;
}
int main()
{
F a(1,2);
func(a);
return 0;
}
这个程序 调了 三次构造 三次 析构,我不明白的的是构造函数形参的是const F& f,那为什么还可以通过f来修改x,不是说const 修饰的是只读的么?还有就是函数func(F x)形参对象应该是先创建的 为什么释放要比返回值的那个对象晚,难道是func函数结束的时候 形参对象 释放 但是 返回值那个对象仍存在? 返回值当时没使用不也释放了么?请看vs下的运行结果:
0020FE68创建一个对象,其成员变量是:1 2 //这个是创建a是 调用的构造函数
0020FD5C创建形参对象13 //这个是实参a 传给形参x时候 调用的构造
0020FD8C创建形参对象14 //返回一个类类型 用x去初始化它,再调用一次构造
0020FD5C对象释放~F()1/3//为什么是这个先释放,这两个不是压栈的么 而且为什么成员属性会改变?
0020FD8C对象释放~F()1/4
0020FE68对象释放~F()1/2
请按任意键继续. . .
------解决方案--------------------
5C 的生命周期到 函数 func 结束
8C 的生命周期,表达式 func(a) j结束
所以 13 先释放,另外,没看到哪里有什么属性改变了
------解决方案--------------------
值参会导致创建一个临时对象,它的生命期基本上等同与函数的局部变量。
返回值也会产生一个临时对象,它的生命期持续到调用该函数的表达式结束。
class F
{
int n;
int d;
public:
F(int n=0, int d=1);
F(const F& f);
~F();
};
F::F(int n, int d):n(n),d(d)
{
cout << this << "创建一个对象,其成员变量是:" << n << ' ' << d << endl;
}
F::F(const F& f):n(f.n),d(f.d+1)
{
cout << this << "创建形参对象" << n << d <<endl;
}
F::~F()
{
cout << this << "对象释放~F()" << n << '/' << d << endl;
}
F func(F x)
{
return x;
}
int main()
{
F a(1,2);
func(a);
return 0;
}
这个程序 调了 三次构造 三次 析构,我不明白的的是构造函数形参的是const F& f,那为什么还可以通过f来修改x,不是说const 修饰的是只读的么?还有就是函数func(F x)形参对象应该是先创建的 为什么释放要比返回值的那个对象晚,难道是func函数结束的时候 形参对象 释放 但是 返回值那个对象仍存在? 返回值当时没使用不也释放了么?请看vs下的运行结果:
0020FE68创建一个对象,其成员变量是:1 2 //这个是创建a是 调用的构造函数
0020FD5C创建形参对象13 //这个是实参a 传给形参x时候 调用的构造
0020FD8C创建形参对象14 //返回一个类类型 用x去初始化它,再调用一次构造
0020FD5C对象释放~F()1/3//为什么是这个先释放,这两个不是压栈的么 而且为什么成员属性会改变?
0020FD8C对象释放~F()1/4
0020FE68对象释放~F()1/2
请按任意键继续. . .
------解决方案--------------------
5C 的生命周期到 函数 func 结束
8C 的生命周期,表达式 func(a) j结束
所以 13 先释放,另外,没看到哪里有什么属性改变了
------解决方案--------------------
值参会导致创建一个临时对象,它的生命期基本上等同与函数的局部变量。
返回值也会产生一个临时对象,它的生命期持续到调用该函数的表达式结束。