收到警告"从字符串常量到 char* 的转换已弃用。为什么我会收到警告?

Getting warning "deprecated conversion from string constant to char*. Why am I getting the warnings?

本文关键字:警告 为什么 字符串 常量 char 转换      更新时间:2023-10-16

我是C++的初学者。我正在研究继承问题。我已经写了一个代码并编译了它,它似乎运行得很好,我得到了预期的输出。但当我编译它时,我得到了13个类似的警告。我不确定是什么问题?如何覆盖这些警告?这是我的代码:

#include <iostream>
#include <string.h>
using namespace std;
class Identity
{
protected:
    char *name;
    int dob;
    char* blood_group;
    Identity(char *iname="", int nlength=1, int idob=0, char *iblood_group="", int blength=2):dob(idob)
    {
        name = new char[nlength+1];
        strncpy(name,iname,nlength);
        name[nlength]='';
        blood_group = new char[blength+1];
        strncpy(blood_group,iblood_group,blength);
        blood_group[blength]='';
    }
    ~Identity()
    {
        delete[] name;
        delete[] blood_group;
    }
};
class Physical
{
protected:
    double height;
    double weight;
    Physical(double pheight = 0.0, double pweight = 0.0):height(pheight),weight(pweight)
    {
    }
};
class Registration
{
protected:
    int policy_number;
    char* contact_address;
    Registration(int p_num=0, char* addr="", int alength=1):policy_number(p_num)
    {
        contact_address = new char[alength+1];
        strncpy(contact_address,addr,alength);
        contact_address[alength] = '';
    }
    ~Registration()
    {
        delete[] contact_address;
    }
};
class Contact:public Identity, public Physical, public Registration
{
private:
    char* ph_number;
    char* driver_license;
public:
    Contact(char *name ="",int nlength=0,int dob = 0, char* blood = "", int blength = 0,double height = 0, double weight = 0, int pol_num = 0, char* cont_addr="", int alength=10, char *ph="",int plength=10,char* lic="",int llength=10):Identity(name,nlength,dob,blood,blength),Physical(height,weight), Registration(pol_num,cont_addr,alength), ph_number(ph),driver_license(lic)
    {
        ph_number = new char[plength+1];
        strncpy(ph_number,ph,plength);
        ph_number[plength] = '';
        driver_license = new char[llength+1];
        strncpy(driver_license,lic,llength);
        driver_license[llength] = '';
    }
    ~Contact()
    {
        delete[] ph_number;
        delete[] driver_license;
    }
    char* GetName()
    {
        return name;
    }
    int GetDob()
    {
        return dob;
    }
    char* GetBloodGroup()
    {
        return blood_group;
    }
    double GetHeight()
    {
        return height;
    }
    double GetWeight()
    {
        return weight;
    }
    int GetPolicyNum()
    {
        return policy_number;
    }
    char* GetAddress()
    {
        return contact_address;
    }
    char* GetPhoneNumber()
    {
        return ph_number;
    }
    char* GetDriverLicense()
    {
        return driver_license;
    }
};
int main()
{
    using namespace std;
    Contact kck("MyName",strlen("MyName"),11111111,"A+",strlen("A+"),15.10,651.5,1111,"MyArea",strlen("MyArea"),"1111111111", strlen("1111111111"),"ABCD1234",strlen("ABCD1234"));
    cout << kck.GetName() << endl;
    cout << kck.GetDob() << endl;
    cout << kck.GetBloodGroup() << endl;
    cout << kck.GetHeight() << endl;
    cout << kck.GetWeight() << endl;
    cout << kck.GetPolicyNum() << endl;
    cout << kck.GetAddress() << endl;
    cout << kck.GetPhoneNumber() << endl;
    cout << kck.GetDriverLicense() << endl;
return 0;
}

在许多地方,您可以编写以下内容:

char *name = ""

但是,""具有类型const char[1]。这隐式地转换为const char *。但是,您尝试将其分配给char *,这是试图忽略const限定符。

由于C++11,这是完全不允许的。在C++11之前,这是允许的,但不推荐使用。编译器警告你这是个坏主意。

如果您真的必须使用指针,那么在任何可能指向字符串文字的情况下都可以使用char const *

但是你最好完全避免使用指针,因为它们会使你的代码复杂化,并引入错误的机会,如果你没有使用指针,就不会出现错误。将字符串的长度与字符串分开传递是非常糟糕的。

例如,使用string保存所有字符串。作为一个初学者,最好从最简单的技术开始,巧合的是,这也是最好的技术。到目前为止,你编写程序的方式只是无端地让自己的生活变得困难。