| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 564 人关注过本帖
标题:各位高手,帮我看看这个代码运行结果呗~~~
只看楼主 加入收藏
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:13 
各位高手,帮我看看这个代码运行结果呗~~~
#include<iostream>
using namespace std;
class ONE{
    int c;
public:
    ONE():c(0){cout<<1;}
    ONE(int n):c(n){cout<<2;}
};
class TWO{
    ONE one1;
    ONE one2;
public:
    TWO(int m):one2(m){cout<<3;}
};
int main(){
    TWO t(4);
    return 0;
}
搜索更多相关主题的帖子: class public 
2011-08-15 20:17
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
米人理我。。。。。。哎
2011-08-15 20:25
hoy0a1d
Rank: 2
等 级:论坛游民
帖 子:19
专家分:83
注 册:2010-8-1
收藏
得分:0 
output: 123

Test.
2011-08-15 22:20
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 3楼 hoy0a1d
为什么会有那个1呢?
2011-08-15 23:05
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:5 

因为TWO类中包含了2个ONE的对象,他们都是默认构造函数(无参),当TWO创建对象时会执行TWO类中的ONE one1;One one2;会输出 11
当然这是无参对象,而你创建是一个带参数的对象时则会调用带参的构造函数.
你的程序中TWO类带参的构造函数里修改了ONE类中one2的对象,所以one2这个对象根据你的修改直接运行带参构造函数而不是默认构造函数所以输出了2;
但one1这个对象是没有被修改,所以one1会调用他的默认构造函数输出1,由于TWO类中先创建one1所以先输出1,接着在创建one2(m),输出了2,接着么在输出了3

          如果你不能理解↑面的意思,那么你自己运行下下面的代码就会明白了
程序代码:
#include<iostream>
using namespace std;
class ONE
{
public:
    ONE(){cout<<"1"<<endl;}
};
class TWO
{
private:
    ONE a;
public:
    TWO(){};
};
void main()
{
    TWO a;
}



[ 本帖最后由 xg5699 于 2011-8-16 00:33 编辑 ]

都不结贴我郁闷那!
2011-08-16 00:15
tiantiancc
Rank: 1
等 级:新手上路
帖 子:6
专家分:1
注 册:2011-8-12
收藏
得分:0 
TWO(int m):one2(m){cout<<3;}
one1调用默认构造函数,one2拷贝构造函数,然后cout<<3

建议好好看看复制控制章节,了解构造函数的调用规则。
2011-08-17 01:01
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 5楼 xg5699
#include<iostream>
using namespace std;
class ONE{
    int c;
public:
    ONE():c(0){cout<<1;}
    ONE(int n):c(n){cout<<2;}
};
class TWO{
    ONE one1;
    ONE one2;
public:
    TWO(int m):one2(m){cout<<3;}
};
int main(){
    TWO t(4);
    return 0;
}


我写一下这个程序运行的整个过程,帮我看下到底是哪一步有问题?

第一种过程:
由于TWO类中有子对象one1和one2,所以要先对t调用类ONE的构造函数。由于t被初始化为4,所以调用ONE带参数的构造函数,输出2.然后调用TWO的构造函数,把one2初始化为4,输出3.整个一来输出的结果是23.(这是我第一次的做题思路)

第二种过程:
由于TWO类中有子对象one1和one2,所以要先调用类ONE的构造函数,对one1和one2进行初始化。one1和one2均不带参,所以调用 ONE():c(0){cout<<1;},输出11,接下来调用TWO的构造函数,把one2初始化为4,输出3.这样结果就是113.
 
我上机试过了,结果确实是123.上面的程序过程错在哪里?能说一下正确的运行顺序吗?


2011-08-17 08:56
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:0 
以下是引用tiantiancc在2011-8-17 01:01:36的发言:

TWO(int m):one2(m){cout<<3;}
one1调用默认构造函数,one2拷贝构造函数,然后cout<<3

建议好好看看复制控制章节,了解构造函数的调用规则。

哪儿调用了拷贝构造函数?
2011-08-17 09:02
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:5 
1、Two t(4)————调用Two的构造函数。
2、Two的构造函数会按照成员变量的顺序依次进行初始化,如果程序员没有显示初始化的,就调用默认的构造函数。如果没有默认的构造函数,编译失败。
1)one1。调用默认的构造函数,输出1。
2)one2。调用带有一个int参数的构造函数,输出2。
3)再执行Two的构造函数函数体,输出3。

所以输出:123
2011-08-17 09:08
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 8楼 zhoufeng1988
我觉得也没用到拷贝构造函数啊,只不过是普通的构造函数而已。多了对子对象的初始化过程
2011-08-17 09:42
快速回复:各位高手,帮我看看这个代码运行结果呗~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028284 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved