下面的类是对的,
class Member{
const char *ms;
public:
Member(const char * s){
cout << "Member(const char* s): " << s << endl;
ms=s;
}
~Member(){
cout << "~Member(): " << ms << endl;
}
};
class Test{
Member mA;
Member mB;
public:
Test() : mB("mB"), mA("mA") {
Test(){
cout << "Test(): " << endl;
}
~Test(){
cout << "~Test(): " << endl;
}
};
我改了一下,改成如下,报错error: no matching function for call to 'Member::Member()':
class Member{ const char *ms; public: Member(const char * s){ cout << "Member(const char* s): " << s << endl; ms=s; } ~Member(){ cout << "~Member(): " << ms << endl; } }; class Test{ Member mA; Member mB; public: //Test() : mB("mB"), mA("mA") { Test(){ mB="mB"; mA="mA"; ; cout << "Test(): " << endl; } ~Test(){ cout << "~Test(): " << endl; } };
类必须有默认构造函数,就是没有参数的构造函数。
默认构造函数是无参构造函数,默认构造函数必须有,没有肯定报错啊。如有帮助,请采纳一下,谢谢。
没有重载“=“运算符?望采纳,不懂的可以关注私信我。
Member类没有显式定义默认构造函数,且自己定义了一个构造函数,所以编译器不会为你生成一个默认构造函数。
Test类你显式定义了默认构造函数(没有参数), 首先,你的数据成员没有类内初始化也就是Member mA = Member("mA");Member mB = Member("mB");这样初始化, 也没有通过构造函数初始值列表对数据成员进行初始化,也就是Test() : mB("mB"), mA("mA"){} 且数据成员的类型即Member类类型没有默认构造函数导致你的数据成员无法被默认初始化, 出错, 与你的函数体内的赋值程序无关。我更愿意把你的函数体内的程序叫做覆盖掉初始值,叫做赋值,而不是叫做初始化。 赋值与初始化 不等同。 一点个人理解,仅作参考,可能不准确。如果有错误,请指教。 (题外话,与你的问题无关:你的char*类型的复合类型的数据成员如果被默认初始化,它的值将会是未定的,应该在类内部初始化或者定义默认构造函数。)
你的正确写法,我复制过来是错误的。你写了两个默认构造函数,且第二个是错误的。即使正确了,也因为重复定义而报错。默认构造关键不在于函数体内部,一般默认构造函数内部都是空,只写初始值列表。
#include<iostream>
using namespace std;
class Member{
const char *ms;
public:
Member(const char * s){
cout << "Member(const char* s): " << s << endl;
ms=s;
}
~Member(){
cout << "~Member(): " << ms << endl;
}
};
class Test{
Member mA;
Member mB;
public:
Test() : mB("mB"), mA("mA") {} //默认构造函数 只要一个初始值列表 函数体内为空
Test(const Test&te):mB(te.mB),mA(te.mA){} //拷贝构造函数
~Test(){}
};
int main(){
Test test = Test(); //调用默认构造函数
Test test1(test); //调用拷贝构造函数
}