C++类和动态内存分配练习

1.给这个类提供实现,并编写程序使用所有成员函数

  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所指的内存地址,此时hobby没有指向什么地方。赋值运算符=ho也是同样的道理。如果你hobby = &("xx") 就是将非const指向const了。
    所以最好就是new 开辟内存空间。
  2. 析构函数要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. 为何没有将运算符重载声明为虚函数呢:
    因为参数不一样,特征不同,没有必要声明为虚函数
  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. 主要讲讲派生类成员函数调用基类成员函数:
    比如运算符重载=函数: 调用基类重载=运算符 Port::operator=(vp),
    首先,调用对象是this,所以this指向返回的对象引用。
    其次,实参为vp,是基类引用,重载函数根据这个特征来使用不同的函数。
  2. 重载<<运算符,因为是友元函数,所以也是多态函数,利用强制类型转换(类型要相同比如const转换为const)可以使派生类引用变为基类引用,从而使用基类友元重载运算符<<.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341