定义类的数据成员时不是一般不会初始化,而是通过构造函数初始化么?那么请问下面的代码为什么编译无法通过?

时间:2022-12-15 19:52:48
#include<iostream>
using namespace std;

template<typename T>
struct A
{
T a1;
T a2;
A(T x,T y)
{
a1=x;
a2=y;
}
/*A()
{} 
};*/ //去掉这个构造函数之后,编译就无法通过,添加了才能通过编译

template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
{
b2=x;
b1=A<T>(x,y);
}
};

int main()
{
A<char> a('c','c');
B<char> b('c','c');
cout<<a.a1<<endl<<a.a2<<endl;
cout<<b.b1.a1<<endl<<b.b1.a2<<endl;
}
如上,在定义B时,B内有类型A的数据成员b1,这时候b1应该没有初始化吧?在B的构造函数里,左值的b1难道以及默认先进行了初始化?所以才会导致编译无法通过?还是说有别的原因?
如果想要不添加A()这个空的构造函数,还能让编译通过,需要在语法上做哪些改动?谢谢!

6 个解决方案

#1



template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};

初始化列表啊。。。

#2


楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。

#3


引用 2 楼 taodm 的回复:
楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。

看过一个cplusplus网站上的tutorial,基本概论稍微了解些,然后想通过实践学习,没想到细节方面的东西还真多。。。。

#4


引用 1 楼 dizuo 的回复:

template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};

初始化列表啊。。。

谢谢,刚刚查了教材,是不是没有默认构造函数的类类型成员都必须显示初始化列表?

#5


A<T> b1;
这就要求A有一个无参数的初始化函数。

#6


用缺省参数
A(T x = 0,T y = 0) : a1(x), a2(y) {}

#1



template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};

初始化列表啊。。。

#2


楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。

#3


引用 2 楼 taodm 的回复:
楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。

看过一个cplusplus网站上的tutorial,基本概论稍微了解些,然后想通过实践学习,没想到细节方面的东西还真多。。。。

#4


引用 1 楼 dizuo 的回复:

template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};

初始化列表啊。。。

谢谢,刚刚查了教材,是不是没有默认构造函数的类类型成员都必须显示初始化列表?

#5


A<T> b1;
这就要求A有一个无参数的初始化函数。

#6


用缺省参数
A(T x = 0,T y = 0) : a1(x), a2(y) {}