C++類和動態(tài)內(nèi)存分配練習

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;
}

程序解析:

  1. hobby是字符串指針,你不能直接用strcpy(hobby,"xxx")或者hobby = ho等,因為你用strcpy的話是把“xxx”復制到hobby所指的內(nèi)存地址,此時hobby沒有指向什么地方。賦值運算符=ho也是同樣的道理。如果你hobby = &("xx") 就是將非const指向const了。
    所以最好就是new 開辟內(nèi)存空間。
  2. 析構函數(shù)要delete []
  3. 重載賦值運算符要返回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

程序解析:

  1. 為何沒有將運算符重載聲明為虛函數(shù)呢:
    因為參數(shù)不一樣,特征不同,沒有必要聲明為虛函數(shù)
  2. 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;
}

程序解析:

  1. 主要講講派生類成員函數(shù)調用基類成員函數(shù):
    比如運算符重載=函數(shù): 調用基類重載=運算符 Port::operator=(vp),
    首先,調用對象是this,所以this指向返回的對象引用。
    其次,實參為vp,是基類引用,重載函數(shù)根據(jù)這個特征來使用不同的函數(shù)。
  2. 重載<<運算符,因為是友元函數(shù),所以也是多態(tài)函數(shù),利用強制類型轉換(類型要相同比如const轉換為const)可以使派生類引用變?yōu)榛愐?,從而使用基類友元重載運算符<<.
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容