标题:为什么下面的拷贝构造函数调用了 this->a的结果却是随机值
只看楼主
万士心平
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-1-30
结帖率:55.56%
已结贴  问题点数:5 回复次数:3 
为什么下面的拷贝构造函数调用了 this->a的结果却是随机值
#include<iostream>
using namespace std;
class A{
    int a;
public:
    A(int x){a=x;cout<<"constructor "<<x<<endl;}
    A(A const &b){
        cout<<"constructor"<<this->a<<endl;
        }
    };
class B{
  A a1,a2;
public:
    B(A a,A b):a1(a),a2(b){  //可以省略无参都早函数的类对象成员或者默认参数的构造函数的类对象成员,也可以这样
    cout<<"B constructor"<<endl;//初始化列表参数既可以是对象(得调用默认构造函数)也可以是
        }

    };
main(){
    A a(3),b(5);
    B b1(a,b);


    }

//而且为什么是调用四次!!咋回事啊
搜索更多相关主题的帖子: 结果 拷贝 随机 构造 函数 
2010-09-07 20:01
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
得分:1 
程序代码:
// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;

class CA
{
public:
    CA(int nX = 0)
    {
        m_nX = nX;
        cout<<"CA(int nX = 0)  "<<m_nX<<endl;
    }
    CA(const CA& r)
    {
        m_nX = r.m_nX;
        cout<<"CA(const CA& r)  "<<m_nX<<endl;
    }
    CA& operator == (const CA& r)
    {
        m_nX = r.m_nX;
        cout<<"CA& operator == (const CA& r)  "<<m_nX<<endl;
    }

private:
    int m_nX;
};

class CB
{
public:
    CB(CA C1, CA C2) : m_CY(C1), m_CZ(C2)
    {
        //m_CY = C1;
        //m_CZ = C2;
        cout<<"CB(CA C1, CA C2) : m_CY(C1), m_CZ(C2)"<<endl;
    }
    CB(const CB& r)
    {
        m_CY = r.m_CY;
        m_CZ = r.m_CZ;
        cout<<"CB(const CB& r)"<<endl;
    }
   
private:
    CA m_CY;
    CA m_CZ;
};


int main()
{
    CA C1(1);
    CA C2(2);
    CB C3(C1, C2);
   
    return 0;
}结果
CA(int nX = 0)  1
CA(int nX = 0)  2
CA(const CA& r)  2
CA(const CA& r)  1
CA(const CA& r)  1
CA(const CA& r)  2
CB(CA C1, CA C2) : m_CY(C1), m_CZ(C2)
1你人为地提供了拷贝构造函数,但函数体内没能写出正确的赋值行为,所以获取的成员值是随机数,也就是成员并没有初始化.
2当一个类CB包含类对象成员(CA),这里CB类的拷贝构造函数执行过程为先传参,传参的过程是从右到左,好像听同学讲汇编时说过参数压栈方式就是这样,然后完成初始化列表的内容.....
这是我的理解...
2010-09-08 00:27
hipwang88
Rank: 2
等 级:论坛游民
威 望:1
帖 子:23
专家分:36
注 册:2010-9-12
得分:1 
错误在B的构造函数上面,你构造函数声明了两个A型形参,那么会调用A的构造函数,然后当时a,b并未赋值,显然就会出现两个随机的A的构造函数出来,再然后你在B的数据部分声明了两个A的对象a1,a2,在构造函数中使用参数列表进行初始化的时候也会调用构造函数,当时参数未初始化,那么又会多出两个随机的A的构造函数,总共四个,给分!
2010-09-12 22:39
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:1 
#include<iostream>
using namespace std;
class A{
    int a;
public:
    A(int x){a=x;cout<<"constructor "<<x<<endl;}
    A(A const &b){
        a=b.a;
        cout<<"constructor  复制"<<this->a<<endl;
        }
    };
class B{
  A a1,a2;
public:
    B(A a,A b):a1(a),a2(b){  //可以省略无参都早函数的类对象成员或者默认参数的构造函数的类对象成员,也可以这样
    cout<<"B constructor"<<endl;//初始化列表参数既可以是对象(得调用默认构造函数)也可以是
        }

    };
main(){
    A a(3),b(5);
    B b1(a,b);


    }
这样就可以啦  你的复制构造函数里面没有对 要用本类对象初始化的对象的 初始化赋值进行事先  在复制构造函数里面加上一句 a=b.a;就OK啦

                                         
===========深入<----------------->浅出============
2010-09-13 22:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-319512-1-1.html




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

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