1.給這個類提供實現(xiàn),并編寫程序使用所有成員函數(shù)
char name[20]; char* hobby; double weight; public: Cow(); Cow(const char* nm,const char* ho,double wt); Cow(const Cow& c); ~Cow(); Cow& operator= (const Cow& c); void showcow() const; };
源代碼文件如下:
#include"cow.h"
#include<iostream>
#include<cstring>
Cow::Cow()
{
strcpy(name,"Jeff");
hobby = new char[3];
strcpy(hobby,"No");
weight = 100;
}
Cow::Cow(const char* nm,const char* ho,double wt)
{
strcpy(name,nm);
hobby = new char[strlen(ho),+1];
strcpy(hobby,ho);
weight = wt;
}
Cow::Cow(const Cow& c)
{
strcpy(name,c.name);
hobby = new char[strlen(c.hobby)+1];
strcpy(hobby,c.hobby);
weight = c.weight;
}
Cow::~Cow()
{
std::cout<<name<<" has delete"<<std::endl;
delete [] hobby;
}
Cow& Cow::operator=(const Cow& c)
{
strcpy(name,c.name);
hobby = new char[strlen(c.hobby)+1];
strcpy(hobby,c.hobby);
weight = c.weight;
return *this;
}
void Cow::showcow() const
{
using std::cout;
using std::endl;
cout<<"Name:\t"<<name<<endl;
cout<<"Hobby:\t"<<hobby<<endl;
cout<<"Weight:\t"<<weight<<endl;
}
程序解析:
- hobby是字符串指針,你不能直接用strcpy(hobby,"xxx")或者hobby = ho等,因為你用strcpy的話是把“xxx”復制到hobby所指的內(nèi)存地址,此時hobby沒有指向什么地方。賦值運算符=ho也是同樣的道理。如果你hobby = &("xx") 就是將非const指向const了。
所以最好就是new 開辟內(nèi)存空間。- 析構函數(shù)要delete []
- 重載賦值運算符要返回this指針指向的對象
#include"cow.h"
#include<iostream>
int main()
{
using std::cout;
using std::endl;
Cow c1;
Cow c2("Jack","Doing sports",120.0);
Cow c3(c2);
Cow c4;
c4 = c3;
cout<<"C1:\n";
c1.showcow();
cout<<"C2:\n";
c2.showcow();
cout<<"C3:\n";
c3.showcow();
cout<<"C4:\n";
c4.showcow();
return 0;
}
結果:
image.png
題目

image.png
類聲明文件
#ifndef PORT_H_
#define PORT_H_
#include<iostream>
using namespace std;
class Port
{
private:
char* brand;
char style[20];
int bottles;
public:
Port(const char* br ="none",const char* st ="none",int b=0);
Port(const Port& p);
virtual ~Port() {delete [] brand;}
Port& operator=(const Port& p);
Port& operator+=(int b);
Port& operator-=(int b);
int BottleCount () const {return bottles;}
virtual void Show() const;
friend ostream& operator<<(ostream& os, const Port& p);
};
class VPort : public Port
{
private:
char* nickname;
int year;
public:
VPort();
VPort(const char* br,const char* st,int b,const char* nn,int y);
VPort(const VPort& vp);
~VPort(){delete [] nickname;}
VPort& operator=(const VPort& vp);
void Show() const;
friend ostream& operator<<(ostream& os,const VPort& vp);
};
#endif
程序解析:
- 為何沒有將運算符重載聲明為虛函數(shù)呢:
因為參數(shù)不一樣,特征不同,沒有必要聲明為虛函數(shù)- operator<<為友元因為調用對象是ostream類
源代碼文件
#include"port.h"
#include<cstring>
Port::Port(const char* br, const char* st, int b)
{
brand = new char[strlen(br)+1];
strcpy(brand,br);
strcpy(style,st);
bottles = b;
}
Port::Port(const Port& p)
{
brand = new char[strlen(p.brand)+1];
strcpy(brand,p.brand);
strcpy(style,p.style);
bottles = p.bottles;
}
Port& Port::operator=(const Port& p)
{
if(this == &p)
return *this;
delete [] brand;
brand = new char[strlen(p.brand)+1];
strcpy(brand,p.brand);
memset(style,'\0',20);
strcpy(style,p.style);
bottles = p.bottles;
return *this;
}
Port& Port::operator+=(int b)
{
bottles += b;
return *this;
}
Port& Port::operator-=(int b)
{
bottles -= b;
return *this;
}
void Port::Show() const
{
cout<<"Brand: "<<brand<<"\n"
<<"Kind: "<<style<<endl<<"Bottles: "
<<bottles<<endl;
}
ostream& operator<<(ostream& os,const Port& p)
{
os<<p.brand<<", "<<p.style<<", "<<p.bottles<<"\n";
return os;
}
VPort::VPort():Port()
{
nickname = new char[7];
strcpy(nickname,"nobody");
year = 0;
}
VPort::VPort(const char* br,const char* st ,int b, const char* nn, int y): Port(br,st,b)
{
nickname = new char[strlen(nn)+1];
strcpy(nickname,nn);
year = y;
}
VPort::VPort(const VPort& vp):Port(vp)
{
nickname = new char[strlen(vp.nickname)+1];
strcpy(nickname,vp.nickname);
year = vp.year;
}
VPort& VPort::operator=(const VPort& vp)
{
if(this == &vp)
return *this;
Port::operator=(vp);
delete [] nickname;
nickname = new char[strlen(vp.nickname)+1];
strcpy(nickname,vp.nickname);
year = vp.year;
}
void VPort::Show() const
{
Port::Show();
cout<<"Nickname: "<<nickname<<endl
<<"Years: "<<year<<endl;
}
ostream& operator<<(ostream& os, const VPort& vp)
{
operator<<(os,(const Port& )vp)<<vp.nickname<<", "<<vp.year<<"\n";
return os;
}
程序解析:
- 主要講講派生類成員函數(shù)調用基類成員函數(shù):
比如運算符重載=函數(shù): 調用基類重載=運算符Port::operator=(vp),
首先,調用對象是this,所以this指向返回的對象引用。
其次,實參為vp,是基類引用,重載函數(shù)根據(jù)這個特征來使用不同的函數(shù)。- 重載<<運算符,因為是友元函數(shù),所以也是多態(tài)函數(shù),利用強制類型轉換(類型要相同比如const轉換為const)可以使派生類引用變?yōu)榛愐?,從而使用基類友元重載運算符<<.
