关于在类中声明对象数据成员时的初始化问题,切判!
近来有一个程序一直困扰着我,希望有高手不吝赐教:
代码如下:
#include<iostream>
using namespace std;
class a //定义一个类
{
private:
int b,c;
public:
a(int b1,int c1):b(b1),c(c1){}//带参数的构造函数--语句1
a(int b1=1,int c1=1):b(b1),c(c1){}//带默认参数的构造函数--语句2
a(const a& a1){b=a1.b,c=a1.c;}//拷贝构造函数--语句3
};
class b //定义第二个类
{
private:
int d;
// a a0(1,2);这样写编译器会提示出错--语句4
a a0;//但如果这样写又怎么初始化a0呢?继续往下看--语句5
public:
//b(int d1,a a1):d(d1),a0(a1){}//如果用参数化列表写b的构造函数,那么编译通过,但是如果写成下面的形式,并在类外定义构造函数,则编译不通过,会出提示: no matching function for call to `a::a()',为什么?
b(int d1,a a1);
b(int d1);//另一种构造,不管a0
};
b::b(int d1)
{
d=d1}
b::b(int d1,a a1)
{
a0=a1;
d=0;
}
int main(int argc,char* argv[])
{
a t(5,6);
b b1(2,t);
}
操作系统:Winxp sp2
编译环境:Dev-c++ 4.9.9.2
问题和现象描述:
1.在类中声明(或定义)另一个类的对象作为数据成员时算“定义”还是算“声明”?
2.为什么在b中声明类a的对象时不能调用a的构造函数?
3.因为构造函数不能被用户(只能被系统)显式调用,而在类b中声明时又不让调用a0的构造函数,那该怎么初始化呢?似乎有点矛盾
现象:如果a中只有语句2(带参数),b中只有语句5,那么编译通过
如果a中只有语句1(不带参数),b中只有语句5,那么编译不通过,提示
no matching function for call to `a::a()';之后,在a中加入语句3,仍有相同提示,错误行出在b的构造函数入口出(是b::b(int d1)下面一行)
4参数化列表和普通构造有什么不同?
真诚希望高手给个系统而完整的分析和总结,感激不尽!!