既然你通过百度知道求助我,我就来了,哈哈,被人称为高手感觉很好。
你的程序的crash问题原因就一个:car构造函数的默认参数错了
你是:car (float =0.0,char ='X',int =0,char * ='\0');
应该:car (float =0.0,char ='X',int =0,char * = “”);
'\0' 确实是字符串结尾字符,但是你这里参数类型是char* ,所以其实你设置的相当于 char* = 0x00000000, 你想要的其实是一个空字符串,所以用 ""(里面存储的其实就是'\0',只是参数类型不同), 这个字符串地址不为0(具体值由每次编译器生成)
crash发生在 b构造的时候, char* = 0x00000000会让库函数strlen 出现空指针解引用,触发异常0xC0000005,造成crash。
PS:另外一个兄弟说的 改 delete 为delete [] 对于基本类型char来说,其实是完全一样的(调试的时候看编译器生成的反汇编就知道了)。 当然对于新手,最好做到new []匹配 delete []
一个是加上using namespace std;
一个是main里a,b初始化写成car *a = new car(25.0,'s',52,"ABC567YYY")的格式,下面也作相应修改。你那么初始化是不成的。
//其实 整体没什么错误 但是可能是打的时候 出了点细微错误 不然回报内存错误吧
#include
#include
#include
class car
{private:
float enginesize;
char bodystyle;
int colorcode;
char * vinptr;
public:
car (float =0.0,char ='X',int =0,char * ="\0");//'\0'是字符而已不是字符串。。。
void dipaly(void);
void operator=(car&);
~car(){delete [] vinptr;};//最好析构要有删除;
};
car::car(float e,char b,int c,char *v)
{enginesize=e;
bodystyle=b;
colorcode=c;
vinptr=new char[strlen(v)+1];
strcpy(vinptr,v);
}
void car::operator=(car& oldcar)
{
enginesize=oldcar.enginesize;
bodystyle=oldcar.bodystyle;
colorcode=oldcar.colorcode;
if(vinptr !=NULL)
delete[](vinptr);//释放内存 最好[]不似乎然不能有效删除
vinptr=new char[strlen(oldcar.vinptr)+1];
strcpy(vinptr,oldcar.vinptr);
}
void car::dipaly(void)
{
cout<<"enginsize:"<
int main()
{
car a(25.0,'s',52,"ABC567YYY");
car b;
a.dipaly();
b.dipaly();
b=a;
b.dipaly();
cin.get();
return 0;
}
不用那么麻烦
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
using namespace std;
class car
{
private:
float enginesize;
char bodystyle;
int colorcode;
/*char * vinptr;*/ //不用这么麻烦
string version;
public:
car (float =0.0,char ='X',int =0,string ="");//可以自己指定一个默认值
void dipaly(void);
void operator=(car &);
};
car::car(float e,char b,int c,string v)
{
enginesize=e;
bodystyle=b;
colorcode=c;
/*vinptr=new char[strlen(v)+1];//
strcpy(vinptr,v);*/
version=v;
}
void car::operator=(car& oldcar)
{
enginesize=oldcar.enginesize;
bodystyle=oldcar.bodystyle;
colorcode=oldcar.colorcode;
/*if(vinptr !=NULL)
delete(vinptr);//释放内存
vinptr=new char[strlen(oldcar.vinptr)+1];
strcpy(vinptr,oldcar.vinptr);*/
version=oldcar.version;
}
void car::dipaly(void)
{
cout<
int _tmain(int argc, _TCHAR* argv[])
{
car a(25.0,'s',52,"ABC567YYY"),b;
a.dipaly();
b.dipaly();
b=a;
b.dipaly();
return 0;
}