欢迎c++爱好者一起探讨一下微软公司最近的一道笔试题,应该能有很多收获.
这是微软的原题.
Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).
我是在vc6.0下写的,写的还不够完善,但大体的功能已经写出来了,有的地方有些图省事用了<cstring>中的库函数.
遇到的问题挺奇怪,经调试应该是析构函数的问题.就是如果调用+=运算符(比如说b += a;),出了主函数作用域对b进行析构时,就会出现警告(在debug模式下),结果能出来,也没错.在release模式下久能很好地运行没有问题.不知道为啥.希望高手指点一下.
等会我到linux下编译试试.
源程序如下:
String.h:
#ifndef STRING_H
#define STRING_H
#include <iostream>
using namespace std;
class String{
public:
String();
String(int n,char c);
String(const char* source);
String(const String& s);
//String& operator=(char* s);
String& operator=(const String& s);
~String();
char& operator[](int i){return a[i];}
const char& operator[](int i) const {return a[i];}//对常量的索引.
String& operator+=(const String& s);
int length();
friend istream& operator>>(istream& is, String& s);//搞清为什么将>>设置为友元函数的原因.
//friend bool operator< (const String& left,const String& right);
friend bool operator> (const String& left, const String& right);//下面三个运算符都没必要设成友元函数,这里是为了简单.
friend bool operator== (const String& left, const String& right);
friend bool operator!= (const String& left, const String& right);
private:
char* a;
int size;
};
#endif
String.cpp:
#include "String.h"
#include <cstring>
#include <cstdlib>
String::String(){
a = new char[1];
a[0] = '\0';
size = 0;
}
String::String(int n,char c){
a = new char[n + 1];
memset(a,c,n);
a[n] = '\0';
size = n;
}
String::String(const char* source){
if(source == NULL){
a = new char[1];
a[0] = '\0';
size = 0;
}
else
{ size = strlen(source);
a = new char[size + 1];
strcpy(a,source);
}
}
String::String(const String& s){
size = strlen(s.a);//可以访问私有变量.
a = new char[size + 1];
//if(a == NULL)
strcpy(a,s.a);
}
String& String::operator=(const String& s){
if(this == &s)
return *this;
else
{
delete[] a;
size = strlen(s.a);
a = new char[size + 1];
strcpy(a,s.a);
return *this;
}
}
String::~String(){
delete[] a;//是这个析构函数不对还是下面这个+=运算符有问题呢?还是别的原因?
}
String& String::operator+=(const String& s){
int j = strlen(a);
size = j + strlen(s.a);
int m = size + 1;
char* b = new char[j+1];
strcpy(b,a);
a = new char[m];
//strcpy(a,b);
int i = 0;
while(i < j){
a[i] = b[i];
i++;
}
delete[] b;
int k = 0;
while(j < m){
a[j] = s[k];
j++;
k++;
}
a[j] = '\0';
return *this;
}
int String::length(){
return strlen(a);
}
main.cpp:
#include <iostream>
#include "String.h"
using namespace std;
bool operator==(const String& left, const String& right)
{
int a = strcmp(left.a,right.a);
if(a == 0)
return true;
else
return false;
}
bool operator!=(const String& left, const String& right)
{
return !(left == right);
}
ostream& operator<<(ostream& os,String& s){
int length = s.length();
for(int i = 0;i < length;i++)
//os << s.a[i];这么不行,私有变量.
os << s[i];
return os;
}
String operator+(const String& a,const String& b){
String temp;
temp = a;
temp += b;
return temp;
}
bool operator<(const String& left,const String& right){
int j = 0;
while((left[j] != '\0') && (right[j] != '\0')){
if(left[j] < right[j])
return true;
else
{
if(left[j] == right[j]){
j++;
continue;
}
else
return false;
}
}
if((left[j] == '\0') && (right[j] != '\0'))
return true;
else
return false;
}
bool operator>(const String& left, const String& right)
{ int a = strcmp(left.a,right.a);
if(a > 0)
return true;
else
return false;
}
istream& operator>>(istream& is, String& s){
delete[] s.a;
s.a = new char[20];
int m = 20;
char c;
int i = 0;
while (is.get(c) && isspace(c));
if (is) {
do {s.a[i] = c;
i++;
/*if(i >= 20){
cout << "Input too much characters!" << endl;
exit(-1);
}*/
if(i == m - 1 ){
s.a[i] = '\0';
char* b = new char[m];
strcpy(b,s.a);
m = m * 2;
s.a = new char[m];
strcpy(s.a,b);
delete[] b;
}
}
while (is.get(c) && !isspace(c));
//如果读到空白,将其放回.
if (is)
is.unget();
}
s.size = i;
s.a[i] = '\0';
return is;
}
int main(){
String a = "abcd";
String b = "www";
//String c(6,b);这么写不对.
String c(6,'l');
String d;
String e = a;//abcd
String f;
cin >> f;
String g;
g = a + b;//abcdwww
if(a < b)
cout << "a < b" << endl;
else
cout << "a >= b" << endl;
if(e == a)
cout << "e == a" << endl;
else
cout << "e != a" << endl;
b += a;
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
cout << g << endl;
cout << g[0] << endl;
return 0;
}
按理析构函数应该没错啊,希望高手来指点一下,谢谢.