包含字符指针和字符数组的类的默认构造函数

时间:2014-08-12 10:08:14

标签: c++

我将课程设计如下

但我在执行时遇到运行时错误。

请告诉我以下解决方案

  1. 为什么main3中的Line3会出现编译错误(如果我只想初始化该类的一个成员,我需要做什么)

  2. 为什么我在第4行遇到运行时错误。

  3. 代码:

    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    class A{
    
        int age;
        char *name;
        char info[50];
    
        public:
        A(int p_age=0,char *p_name=NULL,char p_info[]=NULL)
        {
            cout<<"Constructor called"<<endl;
            age=p_age;
            int length1=strlen(p_name)+1;
            int length2=strlen(p_info)+1;
            strncpy(name,p_name,length1);
            name[length1-1]='\0';
            strncpy(info,p_info,length2);
            info[length2-1]='\0';
        }
    
        void get()
        {
            cout<<"Enter the age";
            cin>>age;
            cout<<"Enter name & info";
            gets(name);
            gets(info);
        }
    
        void display()
        {
            cout<<age<<name<<info;
        }
    };
    
    int main()
    {
        A obj(20,"Ename","Stud");
        obj.display();
        // A obj1("EEEE");//Line3
        A obj2;    //Line 4
        obj2.get();
        obj2.display();
    }
    

5 个答案:

答案 0 :(得分:1)

A obj1("EEEE")是一个错误,因为构造函数的第一个参数被声明为int p_age,并且编译器无法自动将"EEEE"强制转换为int。尝试初始化obj2会导致错误,因为您在调用中未提供任何参数,因此使用默认值,并且当执行行int length1=strlen(p_name)+1;时,strlen()从访问内存时崩溃p_name,为NULL。

答案 1 :(得分:0)

名称未分配。

...
int length1=strlen(p_name)+1;
int length2=strlen(p_info)+1;
name = new char[length1]; // add this line
strncpy(name,p_name,length1);
    name[length1-1]='\0';
strncpy(info,p_info,length2);
    info[length2-1]='\0';
...

答案 2 :(得分:0)

  1. 您在构造函数中的第一个参数是int,而您正试图通过const char*
  2. p_name的默认初始化为NULL,strlen为null会导致分段错误

答案 3 :(得分:0)

在声明中

A obj2

您没有提供p_namep_info参数,因此它们默认为NULL。然后在构造函数中调用

strlen(p_name)
p_name上的

是NULL。这是不允许的。

答案 4 :(得分:0)

让C ++帮助你。

class A{

    int age;
    std::string name;
    std::string info;

public:
    explicit A(int p_age = 0, const std::string& p_name = "", const std::string& p_info = "")
        : age(p_age)
        , name(p_name)
        , info(p_info)
    {
    }
};