栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++每日编程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++每日编程

一个完整的string类(十二章2题)

完成这个程序,对匿名对象的生命周期有了新认识。对这个程序进行了逐步的分析,见代码中每一步注释。

  • string2.h
#pragma once
#ifndef STIRNG2_H_
#define STIRNG2_H_

#include 
#include 
#include 

class string2
{



private:
	char *str;
	int len;
	static int num_string;
	static const int CINLIM = 80;


public:
	string2(const char *); // 将字符串赋值给类对象
	string2();				// 默认构造函数
	string2(const string2 &);	// 初始化构造函数
	~string2();

	int length() const { return len; } // 获取字符串长度,写为内联函数
	string2 & operator=(const string2 &); // 重载等号运算符
	string2 & operator=(const char *);  // 对已有的类进行赋值
	string2  operator+(const string2 &);	// 两个类对象相加
	string2  operator+(const char *); // 类对象和char相加
	string2 &stringLow();		// 大小写转换
	string2 &stringUpper();
	int hasChar(char) const;	// 
	char & operator[](int i);


	// 
	friend bool operator<(const string2 &, const string2 &); // 比较两个字符串大小 
	friend bool operator>(const string2 &, const string2 &);
	friend bool operator==(const string2 &, const string2 &);

	friend std::ostream & operator<<(std::ostream &, const string2 &);
	friend std::istream & operator>>(std::istream &,  string2 &);
	friend string2 operator+(char *, const string2 &);

	static int HowMany();
};




#endif 
  • string.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "string2.h"
#include 
#include 

int string2::num_string = 0;
//private:
//	char *str;
//	int len;
//	static int num_string;
//	static const int CINLIM = 80;
//

//public:
//	string2(const char *); // 将字符串赋值给类对象 
string2::string2(const char *st)
{
	this->len = std::strlen(st);
	this->str = new char[this->len + 1];
	std::strcpy(this->str, st);
	this->num_string++;

}
//	string2();				// 默认构造函数
string2::string2()
{
	len = 4;
	str = new char[1];
	str[0] = '';
	num_string++;
}
//	string2(const string2 &);	// 初始化构造函数
string2::string2(const string2 &st)
{
	this->len = st.len;
	this->str = new char[len + 1];
	strcpy(this->str, st.str);
	num_string++;
}
//	~string2();
string2::~string2()
{
	std::cout << this->str << " 被析构" << std::endl;
	--this->num_string;
	delete[] this->str;
}

//	int length() const { return len; } // 获取字符串长度,写为内联函数

//	string2 & operator=(const string2 &); // 重载等号运算符
string2 & string2::operator=(const string2 &st)
{
	if (*this == st)
	{
		return *this;
	}
	else
	{
		delete[] this->str;
		this->len = st.len;
		this->str = new char[this->len + 1];
		std::strcpy(this->str, st.str);
		return *this;
	}
}
//	string2 & operator=(const char *);  // 对已有的类进行赋值
string2 & string2::operator=(const char *s)
{
	delete[] str;
	this->len = strlen(s);
	str = new char[len + 1];
	strcpy(str, s);
	return *this;

}
//		// 两个类对象相加,返回
string2  string2::operator+(const string2 &st)
{
	string2 str2;
	str2.len = this->len + st.len;
	str2.str = new char[str2.len + 1];
	std::strcat(strcpy(str2.str, this->str), st.str);
	return str2;
}
//	string2 & operator+(const char *); // 类对象和char相加
string2  string2::operator+(const char *s)
{
	string2 str2;
	str2.len = this->len + std::strlen(s);
	str2.str = new char[str2.len + 1];
	strcat(strcpy(str2.str, this->str), s);
	return str2;
}

//	string2 &stringLow();		// 大小写转换
string2 &string2::stringLow()
{
	for (int i = 0; i < this->len; i++)
	{
		if (std::islower(this->str[i]))
		{
			this->str[i] = toupper(this->str[i]);
		}
	}
	return *this;
}
//	string2 &stringUpper();
string2 & string2::stringUpper()
{
	for (int i = 0; i < this->len; i++)
	{
		if (std::isupper(this->str[i]))
		{
			this->str[i] = isupper(this->str[i]);
		}
	}
	return *this;

}
//	int hasChar(char) const;	// 
int string2::hasChar(char c) const
{
	int couter = 0;
	for (size_t i = 0; i < this->len; i++)
	{
		if (this->str[i] == c)
		{
			couter++;
		}
	}
	return couter;
}
//	char & operator[](int i);
char & string2::operator[](int i)
{
	return this->str[i];
}


	// 
	//friend bool operator<(const string2 &, const string2 &); // 比较两个字符串大小 

bool operator<(const string2 &str1, const string2 &str2)
{
	return (strcmp(str1.str, str2.str) < 0);
}
	//friend bool operator>(const string2 &, const string2 &);
bool operator>(const string2 &str1, const string2 &str2)
{
	return str1 < str2;
}
	//friend bool operator==(const string2 &, const string2 &);
 bool operator==(const string2 &str1, const string2 &str2)
{
	return (strcmp(str1.str, str2.str) == 0);
}
	//friend std::ostream & operator<<(std::ostream &, const string2 &);
 std::ostream & operator<<(std::ostream &os, const string2 &st)
 {
	 os << st.str <<'n';
	 return os;
 }
	//friend std::istream & operator>>(std::istream &, const string2 &);
 std::istream & operator>>(std::istream &is,  string2 &st)
 {
	 char temp[string2::CINLIM];
	 is.get(temp, string2::CINLIM); // 接收不多于CINLIM个字符
	 if (is) // 如果输入正确,最多赋予CINLIM个字符。
	 {
		 st = temp;// string2 & string2::operator=(const char *s)
	 }
	 while (is && is.get() != 'n') // 从缓冲区中删除多余的字符
	 {
		 continue;
	 }
	 return is;
 }
	//friend string2 operator+(char *, const string2 &);
 // 将两个字符串合并为一个字符串
 string2 operator+(char *s, const string2 &st)
 {
	 string2 str2;
	 str2.len = st.len + std::strlen(s);
	 str2.str = new char[str2.len + 1];
	 std::strcat(std::strcpy(str2.str, s), st.str);
	 std::cout << "str2临时对象是:" << str2.str << std::endl;
	 return str2; // 生成临时对象,调用这个函数,string2::string2(const string2 &st)
				// 临时对象声明周期,就是这行结束,然后调用~string2()
 }
 // 	static int HowMany();
int string2::HowMany()
{
	return num_string;

}
  • usestring2.cpp
#include 
#include "string2.h"

using namespace std;
int main()
{
	{
		string2 s1("A"); // 调用string2(const char *); 
		string2 s2 = "B";  // string2::string2(const char *st)  // 对已有的类进行赋值
		string2 s3;		// string2::string2() 默认构造函数
		cout << s2;// friend std::ostream & operator<<(std::ostream &, const string2 &)
		cin >> s3; // C  std::istream & operator>>(std::istream &is,  string2 &st)
		s2 = "my name is " + s3; //  string2 operator+(char *s, const string2 &st)
		// 这个运算符先匹配形式,左边是字符串,右边是string类对象,符合重载+运算符,所以先调用上边+运算符重载函数
		// 调用string2 operator+(char *s, const string2 &st)结束后,生成一个临时对象,这个函数return时,此函数中的临时对象被析构掉,然后传给这个("我的名字是" + s3)临时对象,然后开始调用string2 & string2::operator=(const string2 &st),赋值运算符重载函数,这个函数将 ("我的名字是" + s3)这个临时对象“转正”,赋给s2,然后再调用析构函数,析构掉这个("我的名字是" + s3)临时对象。
		// 
		cout << s2 << '.n';
		s2 = s2 + s1; // 先调用,string2  string2::operator+(const string2 &st)
						// 再调用,string2 & string2::operator=(const string2 &st)
						// 也是生成两个临时对象,转正后,被析构
		s2.stringLow();
		cout << s2 << endl;
		s1 = "D"; // 调用重载=  和 string2(const char *); 

		string2 rgb[3] = { string2(s1),string2("green"),string2("E") };
		cout << "输入颜色";
		string2 ans;
		bool success = false;
		while (cin >> ans)
		{
			ans.stringUpper();
			for (int i = 0; i < 3; i++)
			{
				if (ans == rgb[i])	//  bool operator==(const string2 &str1, const string2 &str2)
				{
					cout << "that is rightn";
					success = true;
					break;
				}
			}
			if (success) break;
			else
			{
				cout << "try again!n";
			}

		}

		
	
	}

	system("pause");
	return 0;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920714.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号