C++Primer Plus(第六版) 第十二章 第二题

来源:互联网 发布:剑三苍云捏脸数据成女 编辑:程序博客网 时间:2024/05/20 06:07

本题主要是重载+运算符,使用友元函数,直接返回String。代码如下:

string2.h:

// string2.h// #pragma once#ifndef STRING2_H_#define STRING2_H_#include <iostream>using std::ostream;using std::istream;class String{private:char * str; // pointer to stringint len; // length of stringstatic int num_strings; // number of objectsstatic const int CINLIM = 80; // cin input limitpublic:// constructors and other methodsString(const char * s); // constructorString(); // default constructorString(const String &); // copy constructor~String(); //destructorint length() const { return len; }int has(const char ch) const;void stringlow() const;void stringup() const;// overloaded operator methodsString & operator=(const String &);String & operator=(const char *);char & operator[](int i);const char & operator[](int i) const;// overloaded operator friendsfriend String operator+(const String &st1, const String &st2);friend bool operator<(const String &st1, const String &st2);friend bool operator>(const String &st1, const String &st2);friend bool operator==(const String &st1, const String &st2);friend ostream & operator<<(ostream & os, const String & st);friend istream & operator >> (istream &is, String & st);// static functionstatic int HowMany();};#endif // !STRING2_H_


string2.cpp:

// string2.cpp -- String class methods#include <cstring> // string.h for some#include <cctype>#include "string2.h" // include <iostream>using std::cin;using std::cout;// initializing static class memberint String::num_strings = 0;// static methodint String::HowMany(){return num_strings;}// class methodsString::String(const char * s) // construct String from C string{len = std::strlen(s); // set sizestr = new char[len + 1]; // allot storagestd::strcpy(str, s); // initialize pointernum_strings++; // set object count}String::String() // default constructor{len = 0;str = new char[1];str[0] = '\0'; // default stringnum_strings++;}String::String(const String & st){num_strings++; // handle static member updatelen = st.len; // same lengthstr = new char[len + 1]; // allot spacestd::strcpy(str, st.str); // copy string to new location}String::~String(){--num_strings;delete[] str;}int String::has(const char ch) const{int n = 0;for (int i = 0; i < len; i++){if (ch == str[i]){n++;}}return n;}void String::stringlow() const{for (int i = 0; i < len; i++){str[i] = tolower(str[i]);}}void String::stringup() const{for (int i = 0; i < len; i++){str[i] = toupper(str[i]);}}// overloaded operator methods// assign a String to a StringString & String::operator=(const String & st){if (this == &st){return *this;}delete[] str;len = st.len;str = new char[len + 1];std::strcpy(str, st.str);return *this;}// assign a C string to a StringString & String::operator=(const char * s){delete[] str;len = std::strlen(s);str = new char[len + 1];std::strcpy(str, s);return *this;}// read-write char access for non-const Stringchar & String::operator[](int i){return str[i];}// read-only char access for const Stringconst char & String::operator[](int i) const{return str[i];}// overloaded operator friendsString operator+(const String & st1, const String & st2){char * tmpch = new char[st1.len + st2.len + 1];strcpy(tmpch, st1.str);strcat(tmpch, st2.str);String tmp(tmpch);delete[] tmpch;return (tmp);}bool operator<(const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) < 0);}bool operator>(const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) > 0);}bool operator==(const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) == 0);}// simple String outputostream & operator<<(ostream &os, const String & st){os << st.str;return os;}// quick and dirty String inputistream & operator >> (istream & is, String &st){char temp[String::CINLIM];is.get(temp, String::CINLIM);if (is)st = temp;while (is && is.get() != '\n')continue;return is;}


main.cpp:

#include <iostream>using namespace std;#include "string2.h"int main(){String s1(" and I am a C++ student.");String s2 = "Please enter your name: ";String s3;cout << s2; // overloaded << operatorcin >> s3; // overloaded >> operators2 = "My name is " + s3; // overloaded =, + operatorscout << s2 << ".\n";s2 = s2 + s1;s2.stringup(); // converts string to uppercasecout << "The string\n" << s2 << "\ncontains " << s2.has('A')<< " 'A' characters in it.\n";s1 = "red"; // String(const char *)// then String & operator=(const String &)String rgb[3] = { String(s1),String("green"),String("blue") };cout << "enter the name of a primary color for mixing light: ";String ans;bool success = false;while (cin >> ans){ans.stringlow(); // converts string to lowercasefor (int i = 0; i < 3; i++){if (ans == rgb[i]) // overloaded == operator{cout << "Thar's right!\n";success = true;break;}}if (success)break;elsecout << "Try again!\n";}cout << "Bye\n";cin.get();return 0;}


阅读全文
0 0
原创粉丝点击