第十三周上机

第一题

这个很简单,就给大家看看代码就好

  • class.cpp

class Circle{
      int x,y,r;
      public:
      Circle(int a, int b, int c):x(a),y(b),r(c){}
      void getO(int &a, int &b){a=x;b=y;};
      int getR(){return r;}
      void move(int a, int b){x+=a;y+=b;}
      void setR(int c){r=c;}
  };

第二题

从这一题开始,我们就需要考虑析构函数的问题了,一般来说,涉及到自己申请内存的题目往往需要自己设置析构将内存释放,否则会造成内存泄漏的问题。那么一个问题就诞生了,delete是不能用于系统分配的内存的,所以,如果我们不给类中涉及到动态分配内存的变量赋初值,那么系统会给他一个默认值,这种情况下,当你在其他比如说构造拷贝函数里面delete原来申请的空间的时候就可能会发生错误,比较恶心的是头歌还不会报错,只是程序直接退出。
针对上面这个问题,比较有效的方法就是给涉及到动态空间分配的变量赋初值为NULL,要调用delete的时候就先判空,这样即可规避delete了系统分配内存的问题。


  • 有关于栈的算法。其实并没有多难[一种实现栈的方法](http://t.csdnimg.cn/dPFKY)
    主要是设计好栈顶是啥,是指向栈顶元素还是指向下一个元素应该存放的位置,确定好之后再做分析
    //头文件的修改就让同学们自己做即可
#include <iostream>
#include "class.h"
using namespace std;
mystack::mystack(int num=100)
{
    pointer=new int [num];    
    upOfStack=pointer-1;
    Size=num;
}
bool mystack::isempty()
{
    if (upOfStack==(pointer-1))
    {
        return true;
    }
    else return false;
}
bool mystack::isfull()
{
    if (upOfStack-pointer==(Size-1))
    {
        return true;
    }
    else return false;
}
bool mystack::push(int i)
{
    if (upOfStack-pointer<(Size-1))
    {   upOfStack++;
        *upOfStack=i;
        return true;
    }
    else return false;
}
bool mystack::pop(int &data)
{
    if (upOfStack>=pointer)
    {
        data=*upOfStack;
        upOfStack--;
        return true;
    }
    else return false;
}

第三题

这个题目就和之前说的,注意初始化,另外还有个就是类中的使用,当我们在函数中需要返回一个String类型的,有时候可能会需要返回指针指向的对象,比如(*this),这里存在的问题就在于编译器的转换策略,需要返回的是一个string对象,而你给它的是 *this,这个时候它就会自己创建一个stirng对象并且拷贝当前类的值(就是调用构造拷贝函数复制一下),而如果你返回一个char指针呢?它又会调用类的构造函数,C++的编译机制决定了它会尽量找到匹配的函数对变量进行转换
在这里插入图片描述
在这里插入图片描述


#ifndef CLASS_H
#define CLASS_H
#include<cstring>
using namespace std;
class String {
private:
      char *myStr;
      int myLen;
public:
    String(char *Str = NULL){
        if(Str){
            myLen=strlen(Str);
            myStr=new char[myLen+1];
            strcpy(myStr,Str);
        }
        else
            myStr = NULL;
    }
    // 复制构造函数
    String(const String &str){
        if (str.length()==0)
		{
			myLen=0;
			myStr=nullptr;
		}
		else
		{
			myStr=new char[str.myLen+1];
			strcpy(myStr,str.myStr);
		}
    }
    // 析构函数
    ~String(){
        if (myStr)
		    delete [] myStr;
	}
    // 0:获取字符串长度
    int length() const {
		return myLen;
	}
    // 1:求子字符串[start,end)
    String substr(int start, int end){
		String sub_str;
		sub_str.myStr=new char[end-start+1];
		int i;
		for (i=start;i<end;i++)
		{
			sub_str.myStr[i-start]=myStr[i];
		}
		sub_str.myStr[end-start]='\0';
		sub_str.myLen=end-start;

		return sub_str;
	}
     
    void printStr ()
	{
		for (int i=0;i<myLen;i++) printf("%c",myStr[i]);	
	}
};

#endif /* CLASS_H */

第四题

这个就是简单的多出一个符号的重载,注意下群里提到的头文件不要写函数的定义的问题即可,当然这个题目可以直接不在class.cpp里面引用头文件就是了

#ifndef CLASS_H
#define CLASS_H
#include<cstring>
#include <iostream>
using namespace std;
class String {
private:
      char *myStr;
      int myLen;
public:
    String(char *Str = NULL){
        if(Str){
            myLen=strlen(Str);
            myStr=new char[myLen+1];
            strcpy(myStr,Str);
        }
    }
    // 复制构造函数
    String(const String &str){
        if (str.length()==0)
        {
            myLen=0;
            myStr=nullptr;
        }
        else
        {
            myStr=new char[str.myLen+1];
            strcpy(myStr,str.myStr);
            myLen=str.myLen;
        }
    }
    // 析构函数
    ~String(){
        if (myStr)
            delete [] myStr;
    }
    // 0:获取字符串长度
    int length() const {
        return myLen;
    }
    // 1:求子字符串[start,end)
    String substr(int start, int end){
        String sub_str;
        sub_str.myStr=new char[end-start+1];
        int i;
        for (i=start;i<end;i++)
        {
            sub_str.myStr[i-start]=myStr[i];
        }
        sub_str.myStr[end-start]='\0';
        sub_str.myLen=end-start;
        return sub_str;
    }
    void printStr ()
    {
        for (int i=0;i<myLen;i++) printf("%c",myStr[i]);    
    }
    String& operator=(const String& s)
    {
        // if (myStr)
        //     delete [] myStr;
        myStr=new char[s.myLen+1];
        strcpy(myStr,s.myStr);
        myLen=s.myLen;
        return *this; 
    }
    friend ostream & operator<<(ostream& out,String &s);
};
ostream & operator<<(ostream& out,String &s){
    for (int i=0;i<s.myLen;i++) out<<s.myStr[i];
    return out;
}
#endif /* CLASS_H */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值