c++primer plus 第12章 编程题第1题

  一开始的程序里 类不能连续赋值,内存会报错。debug了一整晚发现是new里面的数组n++出错。经过测试++n和n+1都能使程序正确运行。

  n++会报错是因为先使用n,再对n加1。而我们的期望是开辟一个n+1长度的数组而不是n,所以会报错。

  在单语句中,自增运算和普通的加法没有区别,但是在这种复合语句中千万小心,尽量不使用n++和++n

  

#pragma once
#ifndef COW_H_
#define COW_H_

class Cow
{
private:    //class default private,struct default public
    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;    //display all cow data
};

#endif // !COW_H_

cow.h

#include"Cow.h"
#include<cstring>
#include<iostream>
using std::strcpy;
Cow::Cow()
{
    name[0] = ‘\0‘;
    hobby = new char[1];//为了统一构造函数的型式,兼容析构函数
    hobby[0] = ‘\0‘;
    weight = 0;
}

Cow::Cow(const char * nm, const char * ho, double wt)
{
    weight = wt;
    strcpy(name, nm);
    int n;
    n = strlen(ho);
    hobby = new char[n+1];//记得加1
    strcpy(hobby, ho);
}

Cow::Cow(const Cow & c)
{
    weight = c.weight;
    strcpy(name, c.name);
    int n;
    n = strlen(c.hobby);
    hobby = new char[n+1];
    strcpy(hobby, c.hobby);
}

Cow::~Cow()
{
    delete[]hobby;
    hobby = nullptr;
}

void Cow::ShowCow() const
{
    using std::cout;
    using std::endl;
    cout << name << endl;
    cout << hobby << endl;
    cout << weight << endl;
}

Cow & Cow::operator=(const Cow & c)//记得要return
{
    //先删除后创建,节约内存
    if (this == &c)//判断万一是自身
    {
        return *this;
    }

    delete[] hobby;
    strcpy(name, c.name);
    int n;
    n = strlen(c.hobby);
    hobby = new char[n+1];
    strcpy(hobby, c.hobby);
    weight = c.weight;
    return *this;
}
//连续赋值出错原因竟然是++n!!
//千万不要在new里面n++,尽量少用自增
//++n和n+1都可以,但是n++不行,因为new是先new了n,n再加1,当n++自增运算不是但语句时候,不要用,容易出错,就像这种在括号里的型式

cow.cpp

#include <iostream>
#include <cstring>
#include"Cow.h"

using std::strcpy;
using std::cin;
using std::cout;
using std::endl;
int main()
{
    Cow milk("a", "eat", 56.9);//Cow::Cow ( const char *nm, const char *ho, double wt )

    Cow junk("t", "c", 200.66);//Cow::Cow ( const char *nm, const char *ho, double wt )

    milk.ShowCow();
    cout << endl;
    Cow m1;//Cow::Cow()
    m1 = milk;//Cow & Cow::operator= ( const Cow & c )
    m1.ShowCow();
    cout << endl;
    Cow m2 = junk;//Cow::Cow ( const Cow & c ),等价于m2(junk)
    m2.ShowCow();
    cout << endl;
    Cow m3;//Cow::Cow()
    m3.ShowCow();
    cout << endl;
    m3 = m1 = m2;//Cow & Cow::operator= ( const Cow & c )
    //m3 = m1;
    //m3.ShowCow();
    //m3 = m2;
    m3.ShowCow();
    //为什么两次赋值会出错?
    cout << "ok" << endl;
    return 0;
}

test.cpp

原文地址:https://www.cnblogs.com/syne-cllf/p/9252136.html

时间: 2024-07-31 07:47:51

c++primer plus 第12章 编程题第1题的相关文章

c++primer plus 第11章 编程题第7题

#pragma once #ifndef COMPLEX0_H_ #define COMPLEX0_H_ #include<iostream> class Complex { private: double real; double imgn; public: Complex(); Complex(double a, double b); ~Complex(); Complex operator+(const Complex & a) const; Complex operator-(

c++primer plus 第13章 编程题第2题

#pragma once #ifndef CD_H_ #define CD_H_ //base class class Cd { private: char * performers; char * label; int selection; //number of selection double playtime; public: Cd(); Cd(const Cd & d); Cd(char * s1, char * s2, int n, double x); virtual ~Cd();

c primer plus 第六章编程练习2

使用嵌套循环产生下列图案:$$$$$$$$$$$$$$$ #include<stdio.h> int main(void){ int i,j; for(i=0;i<5;i++){ for(j=0;j<=i;j++){ printf("$"); } printf("\n"); } return 0; }

java第四章编程题(初学篇)

代码: 1 /* 2 test.java 3 */ 4 package test; 5 public class test { 6 public static void main(String args[] ) 7 { 8 CPU ccp= new CPU(); 9 HardDisk hhd=new HardDisk(); 10 PC pc =new PC(); 11 ccp.setSpeed(2200); 12 hhd.setAmount(200); 13 pc.setCPU(ccp); 14

java学习之第五章编程题示例(初学篇)

1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { 7 public abstract void cry(); 8 public abstract String getanimalName(); 9 } 1 //Dog.java 2 package animal; 3 4 public class Dog extends Animal 5 { 6 7 String aa="旺旺"; 8

c++ primer plus(第6版)中文版 第十二章编程练习答案

第十二章编程练习答案 12.1根据以下类声明,完成类,并编小程序使用它 //12.1根据以下类声明,完成类,并编小程序使用它 #include <iostream> #include <cstring> using namespace std; class Cow{ char name[20]; char * hobby; double weight; public: Cow(); Cow(const char * nm, const char * ho, double wt);

c++ primer plus(第6版)中文版 第七章编程练习答案

第七章编程练习答案 7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 //7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 #include <iostream> using namespace std; double average (unsigned x, unsigned y) { return (2.0 * x * y / (x + y)); } int main () { while (true) { unsigned x, y; cout

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条

第12章-Swing编程 --- 使用JProgressBar.ProgressMonitor和BoundedRangeModel创建进度条 (一)创建进度条 使用JProgressBar,可以很方便的创建进度条,其步骤如下: (1)创建一个JProgressBar对象,创建该对象时也可以指定3个参数,用于设置进度条的排列方向(竖直和水平).进度条的最大值和最小值.也可以在创建该对象时不传入任何参数,而是在后面程序中修改这3个属性. 下面代码创建了JProgressBar对象 //创建一条垂直进