using namespace std;
class X{
public:
X(int ii=1){ i=ii;cout<<"x("<<ii<<") created"<<endl; }
private:
int i;
};
class Z{
public:
Z():x3(3),x2(2){ cout<<"Z created"<<endl; }
~Z(){ cout<<"Z desroyed"<<endl; }
private:
X x1,x2,x3;
};
X a(200);
void main(void){
Z z;
{
X c(100);
static X b(50);
}
}
程序是从哪里开始的啊!?
各位大虾说一下啊
13 个解决方案
#1
#include <iostream>
using namespace std;
class X{
public:
X(int ii=1){ i=ii;cout <<"x(" <<ii <<") created" <<endl; } // 此函数被调用输出。
private:
int i;
};
class Z{
public:
Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
~Z(){ cout <<"Z desroyed" <<endl; }
private:
X x1,x2,x3;
};
X a(200); // 最先执行的是全局类对象的构造函数
int main(void){
Z z;
{
X c(100);
static X b(50);
}
}
#2
我编译了一下,结果如下:
x<200> created
x<1> created
x<2> created
x<3> created
Z created
x<100> created
x<50> created
Z desroyed
有几个地方不是很明白,请教:
1
x<2> created 并没有对ii赋值2啊,怎么会输出2呢?
x<3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?
x<200> created
x<1> created
x<2> created
x<3> created
Z created
x<100> created
x<50> created
Z desroyed
有几个地方不是很明白,请教:
1
x<2> created 并没有对ii赋值2啊,怎么会输出2呢?
x<3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?
#3
问一下 Z():x3(3),x2(2) 这个是什么意思啊
#4
哈哈,竟然没看到,晕,我还以为是int 型的呢
#5
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?
#6
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?
#7
Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
在这里,调用Z的构造函数时初始化列表调用的x的构造函数。
只有z才有析构函数啊。
这是构造函数初始化列表,结果相当于:
Z() { x3(3); x2(2); }
但是减少了两次调用X类的构造函数,提高效率。
#8
这里的static就是说b是一个静态类对象啊。
你说的是用static声明类的静态成员或是类的静态成员函数吧,这个找一下书吧,内容挺多呢。但总体是说
类的静态成员是在各个类对象*享的成员,类的静态成员函数只能操作静态成员,可以在未构造类对象之前调用。
#9
首先 x2,x3是用2,3来代替默认形参1初始化,注意到X的构造函数中有默认形参“int ii=1”
析构函数的执行顺序应该是:先调用b和c的析构函数(因为他们在内部的作用域内),然后调用z的析构函数(其中有x1,x2,x3的析构函数,他们都为默认的析构函数),最后调用处于最外部的a的析构函数(也是默认的),个人见解,高手赐教哈.
#10
另外,我认为你可以人为的为每个类添加析构函数,在析构函数中输出数据来标志析构函数被调用,再使用源程序就可以得出析构函数调用的顺序了
更正自己犯的错误哈
析构函数的顺序为:c,z(x3,x2,x1)(注意到a和b都没调用析构函数)
更正自己犯的错误哈
析构函数的顺序为:c,z(x3,x2,x1)(注意到a和b都没调用析构函数)
#11
楼上有道理.
#12
X a(200);////首先执行全局变量调用构造函数X(200)初始化对象a,因为传入了参数两百所以是x <200> created
Z z;////声明了对象所以调用构造函数Z():x3(3),x2(2),因为z有三个数据成员都要初始化,X1调用默认的构造函数X(1),
X2调用X(2),X3调用X(3)
所以是:
x <1> created
x <2> created
x <3> created
最后执行z()函数体内的Z created
X c(100);////x <100> created
static X b(50);////x <50> created
最后函数返回,z对象的生存期结束,调用析构函数。
其实X类的对象也会析构的只不过调用系统默认的。所以你看不到
Z z;////声明了对象所以调用构造函数Z():x3(3),x2(2),因为z有三个数据成员都要初始化,X1调用默认的构造函数X(1),
X2调用X(2),X3调用X(3)
所以是:
x <1> created
x <2> created
x <3> created
最后执行z()函数体内的Z created
X c(100);////x <100> created
static X b(50);////x <50> created
最后函数返回,z对象的生存期结束,调用析构函数。
其实X类的对象也会析构的只不过调用系统默认的。所以你看不到
#13
喔这样喔,那下面这个
Z():x3(3),x2(2){ cout < <"Z created" < <endl; }
也就相当于:
Z() { x3(3); x2(2); }{cout < <"Z created" < <endl;}吗?这个不明白了耶
#1
#include <iostream>
using namespace std;
class X{
public:
X(int ii=1){ i=ii;cout <<"x(" <<ii <<") created" <<endl; } // 此函数被调用输出。
private:
int i;
};
class Z{
public:
Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
~Z(){ cout <<"Z desroyed" <<endl; }
private:
X x1,x2,x3;
};
X a(200); // 最先执行的是全局类对象的构造函数
int main(void){
Z z;
{
X c(100);
static X b(50);
}
}
#2
我编译了一下,结果如下:
x<200> created
x<1> created
x<2> created
x<3> created
Z created
x<100> created
x<50> created
Z desroyed
有几个地方不是很明白,请教:
1
x<2> created 并没有对ii赋值2啊,怎么会输出2呢?
x<3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?
x<200> created
x<1> created
x<2> created
x<3> created
Z created
x<100> created
x<50> created
Z desroyed
有几个地方不是很明白,请教:
1
x<2> created 并没有对ii赋值2啊,怎么会输出2呢?
x<3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?
#3
问一下 Z():x3(3),x2(2) 这个是什么意思啊
#4
哈哈,竟然没看到,晕,我还以为是int 型的呢
#5
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?
#6
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?
#7
Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
在这里,调用Z的构造函数时初始化列表调用的x的构造函数。
只有z才有析构函数啊。
这是构造函数初始化列表,结果相当于:
Z() { x3(3); x2(2); }
但是减少了两次调用X类的构造函数,提高效率。
#8
这里的static就是说b是一个静态类对象啊。
你说的是用static声明类的静态成员或是类的静态成员函数吧,这个找一下书吧,内容挺多呢。但总体是说
类的静态成员是在各个类对象*享的成员,类的静态成员函数只能操作静态成员,可以在未构造类对象之前调用。
#9
首先 x2,x3是用2,3来代替默认形参1初始化,注意到X的构造函数中有默认形参“int ii=1”
析构函数的执行顺序应该是:先调用b和c的析构函数(因为他们在内部的作用域内),然后调用z的析构函数(其中有x1,x2,x3的析构函数,他们都为默认的析构函数),最后调用处于最外部的a的析构函数(也是默认的),个人见解,高手赐教哈.
#10
另外,我认为你可以人为的为每个类添加析构函数,在析构函数中输出数据来标志析构函数被调用,再使用源程序就可以得出析构函数调用的顺序了
更正自己犯的错误哈
析构函数的顺序为:c,z(x3,x2,x1)(注意到a和b都没调用析构函数)
更正自己犯的错误哈
析构函数的顺序为:c,z(x3,x2,x1)(注意到a和b都没调用析构函数)
#11
楼上有道理.
#12
X a(200);////首先执行全局变量调用构造函数X(200)初始化对象a,因为传入了参数两百所以是x <200> created
Z z;////声明了对象所以调用构造函数Z():x3(3),x2(2),因为z有三个数据成员都要初始化,X1调用默认的构造函数X(1),
X2调用X(2),X3调用X(3)
所以是:
x <1> created
x <2> created
x <3> created
最后执行z()函数体内的Z created
X c(100);////x <100> created
static X b(50);////x <50> created
最后函数返回,z对象的生存期结束,调用析构函数。
其实X类的对象也会析构的只不过调用系统默认的。所以你看不到
Z z;////声明了对象所以调用构造函数Z():x3(3),x2(2),因为z有三个数据成员都要初始化,X1调用默认的构造函数X(1),
X2调用X(2),X3调用X(3)
所以是:
x <1> created
x <2> created
x <3> created
最后执行z()函数体内的Z created
X c(100);////x <100> created
static X b(50);////x <50> created
最后函数返回,z对象的生存期结束,调用析构函数。
其实X类的对象也会析构的只不过调用系统默认的。所以你看不到
#13
喔这样喔,那下面这个
Z():x3(3),x2(2){ cout < <"Z created" < <endl; }
也就相当于:
Z() { x3(3); x2(2); }{cout < <"Z created" < <endl;}吗?这个不明白了耶