zoukankan      html  css  js  c++  java
  • 构造一个String类

    #include "stdafx.h"
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    //类的成员函数中,有一些是加了const修饰符的,表示这个函数不会对类的成员进行修改,一些函数的输入参数也加了const修饰,表示该函数不会改变这个参数的值
    class String           
    {
    public:
    	String(const char *str = NULL);  //通用构造函数,没值的时候,用NULL默认初始化
    	String(const String &str);  //拷贝构造函数
    	~String();  //析构函数
    
    	String operator+(const String &str)const;  //重载+
    	String& operator=(const String &str);  //重载=
    	String& operator+=(const String &str);
    	bool operator==(const String &str)const;  //重载==
    	char& operator[](int n)const;   //重载[]
    
    	size_t size()const;   //获取长度
    	const char* c_str()const;  //获取C字符串
    
    	friend std::istream& operator>>(std::istream&is, String &str);  //输入
    	friend std::ostream& operator<<(std::ostream&os, String &str);  //输出
    
    private:
    	char *data;  //字符串
    	size_t length;   //长度
    };
    
    String::String(const char *str) // 通用构造函数
    {
    	if (!str)
    	{
    		length = 0;
    		data = new char[1];
    		*data = '';
    	}
    	else
    	{
    		length = strlen(str);
    		data = new char[length + 1];
    		strcpy_s(data, length+1,str);
    	}
    }
    
    String::String(const String &str) //拷贝构造函数,要深层复制
    {
    	length = str.size();
    	data = new char[length + 1];
    	strcpy_s(data,str.length+1, str.c_str());
    }
    
    String::~String()
    {
    	delete[] data;
    	length = 0;
    }
    
    String String::operator+(String const &str)const
    {
    	String newString;
    	newString.length = length + str.size();
    	newString = new char[newString.length + 1];
    	strcpy_s(newString.data,newString.length+1, data);
    	strcat_s(newString.data,newString.length+1, str.data);
    	return newString;
    }
    
    String& String::operator=(const String &str)  //链式赋值,返回引用(对象本身)
    {
    	if (this == &str)
    		return *this;
    
    	delete[]data;
    	length = str.length;
    	data = new char[length + 1];
    	strcpy_s(data,length+1, str.data);
    	return *this;
    }
    
    String& String::operator+=(const String &str)
    {
    	length += str.length;
    	char *newData = new char[length + 1];
    	strcpy_s(newData,length+1, data);
    	strcat_s(newData,length+1, str.data);
    	delete[]data;
    	data = newData;
    	return *this;
    }
    inline bool String::operator==(const String&str)const
    {
    	/*if (length != str.length)
    		return false;*/
    	return strcmp(data, str.data) ? false : true;
    }
    inline char& String::operator[](int n)const
    {
    	if (n >= length)
    		return data[length - 1];
    	else
    		return data[n];
    }
    inline size_t String::size()const
    {
    	return length;
    }
    //重载输入运算符,先申请一块足够大的内存来存放输入字符串,再进行新的字符串的生成
    std::istream& operator>>(std::istream& is, String &str)  //为了连续输入,返回引用
    {
    	char tem[100];
    	is >> tem;
    	str.length = strlen(tem);
    	str.data = new char[str.length + 1];
    	strcpy_s(str.data,str.length+1, tem);
    	return is;
    }
    std::ostream&operator<<(std::ostream &os, String &str)   //为了连续输出,返回引用(对象本身)
    {
    	os << str.data;
    	return os;
    }
    inline const char* String::c_str()const
    {
    	return data;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	/*String s;
    	std::cin >> s;
    	printf("s:is
    %s
    s.size()is
    %d
    ",s,s.size());*/
    
    	//std::cout << "s:
    " << s<<"
    " << "s.size()
    " << s.size() << std::endl;
    
    
    
    	char a[] = "hello", b[] = "world";
    	String s1(a), s2(b);
    	//printf("s1
    %c
    s2
    %c
    ", s1, s2);
    //	std::cout << s1 << "+" << s2 << "=" << s1 + s2 << std::endl;
    	
    
    
    	String s3 = s1 + s2;
    	if (s1 == s3)
    		cout << "first:s1==s3" << endl;
    	s1 += s2;
    	if (s1 == s3)
    		cout << "second:s1==s3" << endl;
    	return 0;
    }
    

    参看:https://www.cnblogs.com/zhizhan/p/4876093.html

  • 相关阅读:
    零基础学习Java Web开发(一)
    域名的定义
    MyEclipse使用(一)
    VB与C#语言部分不用的地方Part1
    使用XmlWriter创建XML文件
    Spring源码
    Websocket原理
    阿里云
    CSS中position属性( absolute | relative | static | fixed )详解
    C#UDP广域网,局域网通信-原理分析
  • 原文地址:https://www.cnblogs.com/ymd12103410/p/10000861.html
Copyright © 2011-2022 走看看