C++/C 构造函数报错

下面的类是对的, 

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);       //调用拷贝构造函数
}