当前位置:编程学习 > C/C++ >>

高手来啊,c++问题

//  MyString.h

#include <string>
#include <iostream>
using namespace std;
class MyString
{
private:
 char *str;
 int size;
public:
 MyString(void);
 MyString(char *s)
 {size=strlen(s)+1;str=new char[size];if(str==NULL){cout<<"申请空间失败"<<endl;exit(1);}strcpy(str,s);str[size-1]='\0';};
 MyString(const MyString&obj)
 {size=obj.size;str=new char[size];if(str==NULL){cout<<"申请空间失败"<<endl;exit(1);}strcpy(str,obj.str);str[size-1]='\0';};
 ~MyString(void);
 MyString operator=(MyString &obj);
 MyString operator=(char *s);
 MyString operator+(MyString &obj);
 MyString operator+(char *s);
 friend MyString operator+(char *s,MyString &obj);
 void show();
};

//myString.cpp

#include "MyString.h"
#include <iostream>
#include <string>
using namespace std;

MyString::MyString(void)
{
 size=1;
 str=new char[size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 str[size-1]='\0';
}


MyString::~MyString(void)
{
 delete [] str;
}

//串对象赋值
MyString MyString:: operator =(MyString &obj)
{
 delete [] str;
 size=obj.size;
 str=new char[size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(str,obj.str);
 str[size-1]='\0';
}

//字符串赋值
MyString MyString::operator=(char *s)
{
 delete [] str;
 size=strlen(s)+1;
 str=new char[size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(str,s);
 str[size-1]='\0';
}

//串对象连接
MyString MyString::operator+(MyString &obj)
{
 MyString temp;
 delete [] temp.str;
 temp.size=obj.size+size-1;
 temp.str=new char[temp.size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(temp.str,str);
 strcat(temp.str,obj.str);
 //temp.str[temp.size-1]='\0';
 return temp;
}

void MyString::show()
{
 cout<<str<<endl;
}

//字符串连接
MyString MyString::operator+(char *s)
{
 MyString temp;
 delete temp.str;
 temp.size=size+strlen(s);
 temp.str=new char[temp.size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(temp.str,str);
 strcat(temp.str,s);
 temp.str[temp.size-1]='\0';
 return temp;
}

//c++串与连接串对象
MyString operator+(char *s,MyString &obj)
{
 MyString temp;
 delete temp.str;
 temp.size=obj.size+strlen(s);
 temp.str=new char[temp.size];
 if(temp.str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(temp.str,s);
 strcat(temp.str,obj.str);
 temp.str[temp.size-1]='\0';
 return temp;
}

 

 

//main

#include "MyString.h"
#include <iostream>
using namespace std;
void main()
{
 MyString s("我们的回忆");
 MyString m=s;
 m.show();
 MyString o=m+",你是否还会记得";
 o.show();
 m="2012了,"+o;
 m.show();
}

 

为啥MyString o=m;是对的;

而MyString o;

o=m;就错了啊;

我单步调试过,运算没问题,可最后它自动跳到析构函数去了,然后就错误了,求解决

追问:来自手机问问我学到数据结构得串,直接string效率地,功能不全啊
答案:隐含的 this 指针



成员函数具有一个附加的隐含形参,即指向该
类对象的一个指针。这个隐含形参命名为 this,与调用成员函数的对象绑定在
一起。成员函数不能定义 this 形参,而是由编译器隐含地定义。成员函数的函
数体可以显式使用 this 指针,但不是必须这么做。如果对类成员的引用没有限
定,编译器会将这种引用处理成通过 this 指针的引用。
1.何时使用 this 指针
尽管在成员函数内部显式引用 this 通常是不必要的,但有一种情况下必须
这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最
常见的情况是在这样的函数中使用 this:该函数返回对调用该函数的对象的引
用。
某种类可能具有某些操作,这些操作应该返回引用,Screen 类就是这样的一
个类。迄今为止,我们的类只有一对 get 操作。逻辑上,我们可以添加下面的
操作。
? 一对 set 操作,将特定字符或光标指向的字符设置为给定值。
? 一个 move 操作,给定两个 index 值,将光标移至新位置。


理想情况下,希望用户能够将这些操作的序列连接成一个单独的表达式:
// move cursor to given position, and set that character
myScreen.move(4,0).set('#');
这个语句等价于:
myScreen.move(4,0);
myScreen.set('#');
2.返回 *this
在单个表达式中调用 move 和 set 操作时,每个操作必须返回一个引用,
该引用指向执行操作的那个对象:
class Screen {
public:
// inte易做图ce member functions
Screen& move(index r, index c);
Screen& set(char);
Screen& set(index, index, char);
// other members as before
};
注意,这些函数的返回类型是 Screen&,指明该成员函数返回对其自身类类
型的对象的引用。每个函数都返回调用自己的那个对象。使用 this 指针来访问
该对象。下面是对两个新成员的实现:
Screen& Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
Screen& Screen::move(index r, index c)
{
index row = r * width; // row location
cursor = row + c;
return *this;
}


函数中唯一需要关注的部分是 return 语句。在这两个操作中,每个函数都
返回 *this。在这些函数中,this 是一个指向非常量 Screen 的指针。如同任
意的指针一样,可以通过对 this 指针解引用来访问 this 指向的对象。


参考:1.http://baike.zhaoxi.net/view/2140472.htm1
2.《C++ Primer 第四版》 P376
为什么不直接用  string  型的呢,干嘛要自己再构造一个MyString

MyString o=m;这个是调用拷贝构造函数,

而MyString o;

o=m;

这句是调用operator = 赋值函数,

所以这个函数显然是错误的,

MyString MyString::operator=(char *s)
{
 delete [] str;
 size=strlen(s)+1;
 str=new char[size];
 if(str==NULL)
 {cout<<"申请空间失败"<<endl;exit(1);}
 strcpy(str,s);
 str[size-1]='\0';
}

上一个:c++里面IF语句一问题
下一个:C++跟C是共用一个软件吗?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,