C++新手提问:这个代码的第一个输出值为什么是200?

时间:2021-07-28 11:22:33
#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);
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
有几个地方不是很明白,请教:

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


引用 2 楼 beyonddream2008 的回复:
1
x <2> created 并没有对ii赋值2啊,怎么会输出2呢?
x <3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?


Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
在这里,调用Z的构造函数时初始化列表调用的x的构造函数。
只有z才有析构函数啊。

引用 3 楼 c_fresher 的回复:
问一下 Z():x3(3),x2(2)  这个是什么意思啊

这是构造函数初始化列表,结果相当于:

Z() { x3(3); x2(2); }

但是减少了两次调用X类的构造函数,提高效率。

#8


引用 6 楼 ly309431053 的回复:
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?

这里的static就是说b是一个静态类对象啊。

你说的是用static声明类的静态成员或是类的静态成员函数吧,这个找一下书吧,内容挺多呢。但总体是说
类的静态成员是在各个类对象*享的成员,类的静态成员函数只能操作静态成员,可以在未构造类对象之前调用。

#9


引用 2 楼 beyonddream2008 的回复:
我编译了一下,结果如下: 
x <200> created 
x <1> created 
x <2> created 
x <3> created 
Z created 
x <100> created 
x <50> created 
Z desroyed 
有几个地方不是很明白,请教: 

x <2> created 并没有对ii赋值2啊,怎么会输出2呢? 
x <3> created 并没有对ii赋值3啊,怎么会输出3呢? 

能不能分析一下对象a b c z析构函数的执行顺序?


首先 x2,x3是用2,3来代替默认形参1初始化,注意到X的构造函数中有默认形参“int ii=1”
析构函数的执行顺序应该是:先调用b和c的析构函数(因为他们在内部的作用域内),然后调用z的析构函数(其中有x1,x2,x3的析构函数,他们都为默认的析构函数),最后调用处于最外部的a的析构函数(也是默认的),个人见解,高手赐教哈.

#10


另外,我认为你可以人为的为每个类添加析构函数,在析构函数中输出数据来标志析构函数被调用,再使用源程序就可以得出析构函数调用的顺序了
更正自己犯的错误哈
析构函数的顺序为: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类的对象也会析构的只不过调用系统默认的。所以你看不到

#13


引用 7 楼 ydntlk 的回复:
引用 2 楼 beyonddream2008 的回复:
这是构造函数初始化列表,结果相当于: 

C/C++ code
Z() { x3(3); x2(2); }



但是减少了两次调用X类的构造函数,提高效率。

喔这样喔,那下面这个
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
有几个地方不是很明白,请教:

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


引用 2 楼 beyonddream2008 的回复:
1
x <2> created 并没有对ii赋值2啊,怎么会输出2呢?
x <3> created 并没有对ii赋值3啊,怎么会输出3呢?
2
能不能分析一下对象a b c z析构函数的执行顺序?


Z():x3(3),x2(2){ cout <<"Z created" <<endl; }
在这里,调用Z的构造函数时初始化列表调用的x的构造函数。
只有z才有析构函数啊。

引用 3 楼 c_fresher 的回复:
问一下 Z():x3(3),x2(2)  这个是什么意思啊

这是构造函数初始化列表,结果相当于:

Z() { x3(3); x2(2); }

但是减少了两次调用X类的构造函数,提高效率。

#8


引用 6 楼 ly309431053 的回复:
能不能解释一下static的作用啊,c语言中的static,好像和c++中的static的作用不一样?

这里的static就是说b是一个静态类对象啊。

你说的是用static声明类的静态成员或是类的静态成员函数吧,这个找一下书吧,内容挺多呢。但总体是说
类的静态成员是在各个类对象*享的成员,类的静态成员函数只能操作静态成员,可以在未构造类对象之前调用。

#9


引用 2 楼 beyonddream2008 的回复:
我编译了一下,结果如下: 
x <200> created 
x <1> created 
x <2> created 
x <3> created 
Z created 
x <100> created 
x <50> created 
Z desroyed 
有几个地方不是很明白,请教: 

x <2> created 并没有对ii赋值2啊,怎么会输出2呢? 
x <3> created 并没有对ii赋值3啊,怎么会输出3呢? 

能不能分析一下对象a b c z析构函数的执行顺序?


首先 x2,x3是用2,3来代替默认形参1初始化,注意到X的构造函数中有默认形参“int ii=1”
析构函数的执行顺序应该是:先调用b和c的析构函数(因为他们在内部的作用域内),然后调用z的析构函数(其中有x1,x2,x3的析构函数,他们都为默认的析构函数),最后调用处于最外部的a的析构函数(也是默认的),个人见解,高手赐教哈.

#10


另外,我认为你可以人为的为每个类添加析构函数,在析构函数中输出数据来标志析构函数被调用,再使用源程序就可以得出析构函数调用的顺序了
更正自己犯的错误哈
析构函数的顺序为: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类的对象也会析构的只不过调用系统默认的。所以你看不到

#13


引用 7 楼 ydntlk 的回复:
引用 2 楼 beyonddream2008 的回复:
这是构造函数初始化列表,结果相当于: 

C/C++ code
Z() { x3(3); x2(2); }



但是减少了两次调用X类的构造函数,提高效率。

喔这样喔,那下面这个
Z():x3(3),x2(2){ cout < <"Z created" < <endl; }
也就相当于:
Z() { x3(3); x2(2); }{cout < <"Z created" < <endl;}吗?这个不明白了耶