注册 登录
编程论坛 C++教室

为什么下面的拷贝构造函数调用了 this->a的结果却是随机值

万士心平 发布于 2010-09-07 20:01, 666 次点击
#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);


    }

//而且为什么是调用四次!!咋回事啊
3 回复
#2
最近不在2010-09-08 00:27
程序代码:
// 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类的拷贝构造函数执行过程为先传参,传参的过程是从右到左,好像听同学讲汇编时说过参数压栈方式就是这样,然后完成初始化列表的内容.....
这是我的理解...
#3
hipwang882010-09-12 22:39
错误在B的构造函数上面,你构造函数声明了两个A型形参,那么会调用A的构造函数,然后当时a,b并未赋值,显然就会出现两个随机的A的构造函数出来,再然后你在B的数据部分声明了两个A的对象a1,a2,在构造函数中使用参数列表进行初始化的时候也会调用构造函数,当时参数未初始化,那么又会多出两个随机的A的构造函数,总共四个,给分!
#4
laoyang1032010-09-13 22:26
#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啦
1