C++学习(一)——标准库类型之string全解析

0. 标准库类型之string类   用户程序要使用 string 类型对象,必须包含相关头文件。如果提供了合适的 using 声明,那么编写出来的程序将会变得简短些。因此头文件部分必备的三行代码:

#include  <iostream>
#include  <string>   //如果包含非标准输入输出头文件iostream.h,编译会出错.string.h是C语言中字符串的头文件,不适用于C++.
using namespace std;    

1. 几种初始化string 对象的方式

代码

对应含义

string s1

默认构造函数 s1 为空串

string s2(s1)

将 s2 初始化为 s1 的一个副本

string s3(“value”)

将 s3 初始化为一个字符串字面值副本

string s4(n, ‘c’)

将 s4 初始化为字符 ‘c’ 的 n 个副本

2. string对象的操作

Tables

Are

s.empty()

如果 s 为空串,则返回 true,否则返回 false。

s.size()

返回 s 中字符的个数

s[n]

返回 s 中位置为 n 的字符,位置从 0 开始计数

s1 + s2

把 s1 和s2 连接成一个新字符串,返回新生成的字符串

s1 = s2

把 s1 内容替换为 s2 的副本

v1 == v2

比较 v1 与 v2 的内容,相等则返回 true

3. 常见面试题:实现一个 String 类

  首先选择数据成员,最简单的 String 只有一个 char* 成员变量。   其次决定支持哪些操作,常见的构造、析构、拷贝构造、赋值这几样是肯定要有的。

class String{
public:
    // 默认构造函数
    String(const char* str = NULL);
    // 复制构造函数
    String(const String &str);
    // 析构函数
    ~String();
    // 字符串连接
    String operator+(const String & str);
    // 字符串赋值
    String & operator=(const String &str);
    // 字符串赋值
    String & operator=(const char* str);
    // 判断是否字符串相等
    bool operator==(const String &str);
    // 获取字符串长度
    int length();
    // 求子字符串[start,start+n-1]
    String substr(int start, int n);
    // 重载输出
    friend ostream & operator<<(ostream &o,const String &str);
private:
    char* data;
    int size;
};
// 构造函数
String::String(const char *str){
    if(str == NULL){
        data = new char[1];
        data[0] = '\0';
        size = 0;
    }//if
    else{
        size = strlen(str);
        data = new char[size+1];
        strcpy(data,str);
    }//else
}
// 复制构造函数
String::String(const String &str){
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
}
// 析构函数
String::~String(){
    delete[] data;
}
// 字符串连接
String String::operator+(const String &str){
    String newStr;
    //释放原有空间
    delete[] newStr.data;
    newStr.size = size + str.size;
    newStr.data = new char[newStr.size+1];
    strcpy(newStr.data,data);
    strcpy(newStr.data+size,str.data);
    return newStr;
}
// 字符串赋值
String & String::operator=(const String &str){
    if(data == str.data){
        return *this;
    }//if
    delete [] data;
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
    return *this;
}
// 字符串赋值
String& String::operator=(const char* str){
    if(data == str){
        return *this;
    }//if
    delete[] data;
    size = strlen(str);
    data = new char[size+1];
    strcpy(data,str);
    return *this;
}
// 判断是否字符串相等
bool String::operator==(const String &str){
    return strcmp(data,str.data) == 0;
}
// 获取字符串长度
int String::length(){
    return size;
}
// 求子字符串[start,start+n-1]
String String::substr(int start, int n){
    String newStr;
    // 释放原有内存
    delete [] newStr.data;
    // 重新申请内存
    newStr.data = new char[n+1];
    for(int i = 0;i < n;++i){
        newStr.data[i] = data[start+i];
    }//for
    newStr.data[n] = '\0';
    newStr.size = n;
    return newStr;
}
// 重载输出
ostream & operator<<(ostream &o, const String &str){
    o<"<

4.备注

  另外一篇博客也很清晰的讲解了标准C++中的string类的用法总结 http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【编程基础】System.arraycopy()和 Arrays.copyOf()

在Java中如果要copy一个数组有两种系统api可以使用System.arraycopy()和Arrays.copyOf()。那么这两个方法有什么不同吗?下面...

3288
来自专栏JAVA同学会

String是值传递还是引用传递

今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还...

823
来自专栏青枫的专栏

java基础学习_集合类04_Map接口、Collections工具类_day18总结

============================================================================= ==...

521
来自专栏aCloudDeveloper

经典排序之 冒泡排序

Author: bakari  Date: 2012.7.30 排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之...

1939
来自专栏Golang语言社区

Go语言——再论slice切片

Slice是长度可变的元素序列(数组不可变),每个元素都有相同的类型。slice类型写作[]T,其中T代表slice中的元素类型;slice和数组写法很像,只是...

35616
来自专栏Java技术栈

Java 常见的 30 个误区与细节!

1291
来自专栏Android先生

Kotlin的高阶函数和常用高阶函数

首先我们可以知道, forEach 是 Array 的扩展函数,然后参数是 action ,但是 action 不再像和我们以前Java那样传递的是一个对象,这...

321
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day10 Java中的数组

  什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去。   那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩...

1776
来自专栏电光石火

HashSet

HashSet类,是存在于java.util包中的类。同时也被称为集合,该容器中只能存储不重复的对象 方法摘要 boolean add(E e) 如...

1865
来自专栏IT可乐

JDK1.8源码(一)——java.lang.Object类

  本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址。   首先介绍JDK中所有类的基类——java.lang.Object。   ...

60015

扫码关注云+社区