类组合涉及初始化问题

下面代码中,类B里组合了类A,运行时会报错,

class A
{
public:
    A(int _a)
    {
        a = _a;
        cout << "构造函数" << "a" << a << endl;
    }
        ~A()
    {
        cout << "析构函数" << "a" << a << endl;
    }
protected:
private:
    int a;
};
class B
{
public:
protected:
private:
    int b1;
    int b2;
    A a2;
    A a1;
}; 
void obj10play()
{
    A a1(10);
    B ojbB;
    return ;
}
void main()
{
    obj10play();
    system("pause");
} 

出错根源在于给类B分配内存时,因含有类A作为类B成员变量的一部分,个人认为,类A中已有有参构造函数,类B中定义的类A带无参数,是无法执行类A的构造函数的,就是说无法找到类A的入口,那类B就无法完成创建内存,这样改,把类A有参数构造函数变成无参构造函数:

class A
{
public:
    A()
    {
        cout << "构造函数" << "a" << a << endl;
    }
    ~A()
    {
        cout << "析构函数" << "a" << a << endl;
    }
protected:
private:
    int a;
};
class B
{
public:
protected:
private:
    int b1;
    int b2;
    A a2;
    A a1;
};
void obj10play()
{
    A a1();
    B ojbbB;
    return;
}
void main()
{
    obj10play();
    system("pause");
}

唉,果然运行是正常的,问题来了,你无法用类B来给类A做初始化,感觉没什么意义,C++提供了这样一个语法,constructor:m1(v1),m2(v2),m3(v3)    。下面为修改后:

class A
{
public:
    A(int _a)
    {
        a = _a;
        cout << "构造函数" << "a" << a << endl;
    }
    ~A()
    {
        cout << "析构函数" << "a" << a << endl;
    }
protected:
private:
    int a;
};

class B
{
public:
    B(int _b1, int _b2) : a1(1), a2(2), c(0)
    {

    }

    B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0)
    {
        b1 = _b1;
        b2 = _b2;
        cout <<"B的构造函数"<<endl;
    }
    ~B()
    {
        cout<<"B的析构函数" <<endl;
    }
protected:
private:
    int b1;
    int b2;
    A a2;
    A a1;
    const int c;
};

void obj10play()
{
    A a1(10);
    B ojbB(1, 2);
    B ojbB2(1, 2,3, 4);
    return ;
}

void main()
{
    obj10play();
    system("pause");
}

这样,问题就解决了,本质上,我觉得还是构造函数参数的对称问题,,,,,,,,

constructor:m1(v1),m2(v2),m3(v3) 这样的语法,它执行的顺序是按照类中成员变量的排序顺序来执行的,而非此语法的排序顺序决定。完毕。

 

posted @ 2019-09-27 22:28  千浦千钰  阅读(357)  评论(0编辑  收藏  举报