默认构造函数参数错误 - 'Autoturism::Autoturism(char *,unsigned int)':无法将参数 1 从 'const char [6]' 转换为 'char *'

Default Constructor Parameter Error - 'Autoturism::Autoturism(char *,unsigned int)': cannot convert argument 1 from 'const char [6]' to 'char *'

一个解决方案是使用(char*)"Rosie"转换为char*,我想知道它是否是另一个。

C++ 中的字符串文字具有常量字符数组类型,这些常量字符数组用作表达式,极少数情况下会转换为指向其第一个字符类型 const char * 的指针。但是构造函数的第一个参数的类型是 char * 而不是 const char *。所以编译器报错。

此外,由于默认参数动态分配内存但未删除内存,因此构造函数可能会产生内存泄漏。

您至少可以通过以下方式声明构造函数

Autoturism( const char * = "", unsigned int = 0 );

由于内存是动态分配的,因此您需要明确定义将删除分配的内存的析构函数以及复制构造函数和复制赋值运算符,或者将最后两个定义为已删除。

首先,请注意您的默认参数值 (c = new char[1]()) 是内存泄漏,因为构造函数不会将 new[] 编辑的内存的所有权交给 delete[] 它之后。永远没有充分的理由为参数的默认值使用 new[] 的内存。

"Rosie" 是一个字符串文字。它有一个 const char[6] 类型,在 C++11 和更高版本中 不能 被分配 as-is 到 non-const char* 指针, 一个明确的 type-cast 是必需的(在这种情况下,你 应该 使用 const_cast 而不是 C-style 转换),例如:

#include <iostream>
#include <string>

class Autoturism
{
    static int nr_autoturisme; // nr_autoturis 'active'
    char* culoare;
    unsigned int a_fabricatie;
    
public:
    Autoturism(char* = nullptr, unsigned int = 0);
    ~Autoturism();

    // TODO: you will also need a copy constructor and a
    // copy assignment operator, per the Rule of 3/5/0:
    // https://en.cppreference.com/w/cpp/language/rule_of_three
    ...
};

int Autoturism::nr_autoturisme{ 0 };

Autoturism::Autoturism(char* c, unsigned int an)
{
    if (!c) c = const_cast<char*>("");

    size_t len = strlen(c);
    culoare = new char[len + 1];
    strcpy_s(culoare, len + 1, c);

    an_fabricatie = an;
    ++nr_autoturism;    

    std::cout << "\nConstructorul a fost apelat !";
}

Autoturism::~Autoturism()
{
    delete[] culoare;

    std::cout << "\nDeconstructorul a fost apelat !";
}

...

int main()
{
    Autoturism a1;
    Autoturism a2(const_cast<char*>("Rosie"), 1999);

    ...

    return 0;
}

否则,如果您真的打算继续使用 C-style 字符串处理,那么您 应该 c 参数更改为 const char* (它应该是一个 pointer-to-const 无论如何,因为构造函数不修改指向的数据),例如:

#include <iostream>
#include <string>

class Autoturism
{
    static int nr_autoturisme; // nr_autoturis 'active'
    char* culoare;
    unsigned int a_fabricatie;
    
public:
    Autoturism(const char* = "", unsigned int = 0);
    ~Autoturism();

    // TODO: you will also need a copy constructor and a
    // copy assignment operator, per the Rule of 3/5/0:
    // https://en.cppreference.com/w/cpp/language/rule_of_three
    ...
};

int Autoturism::nr_autoturisme{ 0 };

Autoturism::Autoturism(const char* c, unsigned int an)
{
    if (!c) c = "";

    size_t len = strlen(c);
    culoare = new char[len + 1];
    strcpy_s(culoare, len + 1, c);

    an_fabricatie = an;
    ++nr_autoturism;    

    std::cout << "\nConstructorul a fost apelat !";
}

Autoturism::~Autoturism()
{
    delete[] culoare;

    std::cout << "\nDeconstructorul a fost apelat !";
}

...

int main()
{
    Autoturism a1;
    Autoturism a2("Rosie", 1999);

    ...

    return 0;
}

但是,话虽如此,您为什么要在 C++ 中使用这种旧的 C-style 字符串处理?您 应该 改用 std::string(您已经包括 <string> header),让它为您处理所有内存管理,例如:

#include <iostream>
#include <string>

class Autoturism
{
    static int nr_autoturisme; // nr_autoturis 'active'
    std::string culoare;
    unsigned int a_fabricatie;
    
public:
    Autoturism(const std::string & = "", unsigned int = 0);

    // std:string is already compliant with the Rule of 3/5/0,
    // so the compiler's auto-generated destructor, copy constructor,
    // and copy assignment operator will suffice...
};

int Autoturism::nr_autoturisme{ 0 };

Autoturism::Autoturism(const std::string &c, unsigned int an)
{
    culoare = c;
    an_fabricatie = an;
    ++nr_autoturism;    

    std::cout << "\nConstructorul a fost apelat !";
}

int main()
{
    Autoturism a1;
    Autoturism a2("Rosie", 1999);

    ...

    return 0;
}