string类(详细描述)

目录

一、简介:

二、string的构造函数

三、string的赋值操作

四、string的取值和修改操作

4.1、string的取值和修改操作

 4.2、字符串的取值和修改操作之at方法和重载operator[]方法的区别

五、string的拼接操作

六、string的查找和替换操作

七、string的比较操作

八、string的子串、插入和删除操作

九、string的C风格和C++风格


一、简介:

string中文意思是字符串,string是一个类,在C++语言中,string类型不属于基础类型,string是一个模板类,实例化就是一个对象。也可以理解为他是一个可以操作字符串的类。

基础类型有八种:byte、boolean、char、short、int、float、long、double

string模板类原型:

template <class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>>
class basic_string;

        定义了一个名为basic_string的模板类,它有三个模板参数:CharTTraitsAllocator。这些参数分别指定了字符类型、字符特性和分配器类型用于分配内存。

CharT参数表示字符类型,通常使用char来表示普通的字符串。Traits参数表示字符操作的特性,比如比较、复制等。Allocator参数表示内存分配器类型,用于在运行时分配和释放内存。

 

二、string的构造函数

string类

 * string();//默认无参构造函数
 * string(const string &str);//默认拷贝构造函数
 * string(const char *str);//有一个参数的有参构造函数,使用char *类型初始化string对象
 * string(int n,char c);//有两个参数的有参构造函数,第一个参数表示使用的数量,第二个参数表示数据,即使用n个字符c 初始化string对象

#include <iostream>
#include<string>
using namespace std;

/*
 * string();//默认无参构造函数
 * string(const string &str);//默认拷贝构造函数
 * string(const char *str);//有一个参数的有参构造函数,使用char *类型初始化string对象
 * string(int n,char c);//有两个参数的有参构造函数,第一个参数表示使用的数量,第二个参数表示数据,即使用n个字符c 初始化string对象
 */

void test(){

    string str1("hello,world!");//有一个参数的有参构造函数,string类的对象是str1
    cout<<str1<<endl;//可以直接把对象当做字符串遍历

    string str2(9,'H');//有两个参数的有参构造函数。string类的对象是str2
    cout<<str2<<endl;

    string str3(str1);//拷贝构造函数
    cout<<str3<<endl;

    const char *str4="hello,string类";
    string str5(str4);//一个参数的有参构造函数
    cout<<str5<<endl;
}

int main()
{
    test();//调用函数
    return 0;
}

输出结果:

注意 char *str4="hello,string类";虽然编译通过,但是会报警告,因为这是错误的写法,"hello,string类"是一个常量,而char *str4是一个指针类型变量,正确的写法应该是 加const修饰,修饰指针不可更改,即const *str4="hello,string类";

三、string的赋值操作

   string &operator=(const char *s);//重载赋值运算符,使用c风格的字符串类型赋值给当前对象
    string &operator =(const string &str);//把str对象赋值给当前对象
    string &operator =(char c);//字符赋值给当前对象
    string &assign(const char *s);//把字符串赋值给当前对象
    string &assign(const char *s,int n);//把字符串s的前n个字符赋值给当前对象
    string &assign(const string &s);//把字符串s赋值给当前对象
    string &assign(int n,char c);//用n个字符c赋值给当前对象
    string &assign(const string &s,int start,int n);//将s从start开始的n个字符赋值给当前对象
  

#include <iostream>
#include<string>
using namespace std;

void test1(){
    /*
    string &operator=(const char *s);//重载赋值运算符,使用c风格的字符串类型赋值给当前对象
    string &operator =(const string &str);//把str对象赋值给当前对象
    string &operator =(char c);//字符赋值给当前对象
    string &assign(const char *s);//把字符串赋值给当前对象
    string &assign(const char *s,int n);//把字符串s的前n个字符赋值给当前对象
    string &assign(const string &s);//把字符串s赋值给当前对象
    string &assign(int n,char c);//用n个字符c赋值给当前对象
    string &assign(const string &s,int start,int n);//将s从start开始的n个字符赋值给当前对象
    */
    string str1;
    str1="hello,stringC风格赋值操作";
    string str2;
    str2=str1;//对象赋值
    string str3;
    str3='H';//字符赋值
    string str4;
    const char *str0="hello,C风格的字符串";
    str4.assign(str0);//C风格字符串通过assign函数赋值
    string str5;
    str5.assign(str0,5);//前5个字符赋值给当前对象
    string str6;
    str6.assign(str5);//把str5对象赋值给str6对象
    string str7;
    str7.assign(9,'H');//把9个H赋值给当前对象
    string str8;
    str8.assign(str4,5,4);//将str4的从第五个字符开始的4个字符赋值给当前对象
    //遍历8个对象
    cout<<str1<<endl;
    cout<<str2<<endl;
    cout<<str3<<endl;
    cout<<str4<<endl;
    cout<<str5<<endl;
    cout<<str6<<endl;
    cout<<str7<<endl;
    cout<<str8<<endl;

}

int main()
{
    test1();//调用函数
    return 0;
}

输出结果:

注意:一个汉字,占两个字符 ,这里使用的是Qt软件 编码格式使用默认的system,一般是utf8编码

四、string的取值和修改操作

4.1、string的取值和修改操作

   /*
   char &operator[](int n);//重载[]运算符,n是下标
   char &at(int n);//通过at方法获取下标为n的元素
   */

#include <iostream>
#include<string>
using namespace std;

void test2(){
   /*
   char &operator[](int n);//重载[]运算符,n是下标
   char &at(int n);//通过at方法获取下标为n的元素
   */
    string str1="hello,string类";//赋值运算符赋值初始化,一般不建议,在这里可以用,因为是常量,不会发生隐式转换
    string str2("hello,string类");//直接赋值初始化,建议使用该方法
    str2[4]='H';//将字符串第五个元素改为H
    cout<<str2<<endl;
    cout<<str2[4]<<endl;

    str1.at(1)='E';//使用at方法取值然后修改值
    cout<<str1<<endl;
    cout<<str1[1]<<endl;

}

int main()
{
    test2();//调用函数
    return 0;
}

输出结果:

 4.2、字符串的取值和修改操作之at方法和重载operator[]方法的区别

使用重载operator[]运算符方法,下标越界不会抛出异常

#include <iostream>
#include<string>
using namespace std;

void test2(){
   /*
   char &operator[](int n);//重载[]运算符,n是下标
   char &at(int n);//通过at方法获取下标为n的元素
   */
    string str1="hello,string类";//赋值运算符赋值初始化,一般不建议,在这里可以用,因为是常量,不会发生隐式转换
    string str2("hello,string类");//直接赋值初始化,建议使用该方法
    str2[4]='H';//将字符串第五个元素改为H
    cout<<str2<<endl;
    cout<<str2[4]<<endl;

    str1.at(1)='E';//使用at方法取值然后修改值
    cout<<str1<<endl;
    cout<<str1[1]<<endl;

    try{
        str1[100000]='H';//数组下标访问越界,使用operator[]方法不会抛出异常
    }
    catch(exception &str){
        cout<<str.what()<<endl;//接收来自try的异常

    }
    printf("hello,string测试\n");//测试

}

int main()
{
    test2();//调用函数
    return 0;
}

输出结果:

使用at方法,下标越界会抛出异常

#include <iostream>
#include<string>
using namespace std;

void test2(){
   /*
   char &operator[](int n);//重载[]运算符,n是下标
   char &at(int n);//通过at方法获取下标为n的元素
   */
    string str1="hello,string类";//赋值运算符赋值初始化,一般不建议,在这里可以用,因为是常量,不会发生隐式转换
    string str2("hello,string类");//直接赋值初始化,建议使用该方法
    str2[4]='H';//将字符串第五个元素改为H
    cout<<str2<<endl;
    cout<<str2[4]<<endl;

    str1.at(1)='E';//使用at方法取值然后修改值
    cout<<str1<<endl;
    cout<<str1[1]<<endl;

    try{
        //str1[100000]='H';//数组下标访问越界,使用operator[]方法不会抛出异常
        str1.at(100000)='H';//抛出异常,程序不会终止
    }
    catch(exception &str){
        cout<<str.what()<<endl;//接收来自try的异常

    }
    printf("hello,string测试\n");//测试

}

int main()
{
    test2();//调用函数
    return 0;
}

输出结果:

tips:at方法抛出异常之后,程序不终止,且抛出异常提示,该大小只有14个字节,100000超过

五、string的拼接操作

  /*
    string &operator+=(const string &str);//重载+=运算符
    string &operator +=(const char *str);//c风格
    string &operator +=(const char c);
    string &append(const char *s);//append追加方法
    string &append(const char *str,int n);
    string &append(const string &s);
    string &append(const string &s,int pos,int n);
    string &append(int n,char c);
   */

#include <iostream>
#include<string>
using namespace std;

void test3(){
    /*
    string &operator+=(const string &str);//重载+=运算符
    string &operator +=(const char *str);//c风格
    string &operator +=(const char c);
    string &append(const char *s);//append追加方法
    string &append(const char *str,int n);
    string &append(const string &s);
    string &append(const string &s,int pos,int n);
    string &append(int n,char c);
   */

    string str1="hello,string";
    string str2=",world";
    str1+=str2;//两个对象相加赋值给str1对象

    string str3="hello,baby";
    str3+="欢迎来到这个世界!";//C风格相加

    string str4("you are welcome");
    str4+='H';//字符追加

    string str5("baby");
    str5.append("hello");//append方法追加

    string str6("god");
    str6.append("hello,string",2);//前两个追加给str6对象

    string str7("luck");
    str7.append(str6);

    string str8("hi");
    str8.append(str4,3,4);

    string str9("wow");
    str9.append(9,'Q');

    //遍历
    cout<<str1<<endl;
    cout<<str2<<endl;
    cout<<str3<<endl;
    cout<<str4<<endl;
    cout<<str5<<endl;
    cout<<str6<<endl;
    cout<<str7<<endl;
    cout<<str8<<endl;
    cout<<str9<<endl;
}

int main()
{
    test3();//调用函数
    return 0;
}

输出结果:

六、string的查找和替换操作

  /*
    int find(const string &str,int pos=0) const;//查找str第一次出现的位置,从第pos位置开始查找
    int find(const char *s,int pos=0) const;//查找字符s第一次出现的位置,从pos位置开始查找
    int find(const char *s,int pos,int n) const;//从pos查找s的前n个字符在当前对象出现的位置
    int find(const char c,int pos=0) const;
    int rfind(const string &str,int pos=npos) const;//查找最后一次出现的位置
    int rfind(const char *s,int pos=npos) const;
    int rfind(const char *s,int pos,int n) const;
    int rfind(const char c,int pos=0) const;
    string &replace(int pos,int n,const string &str);//replace替换方法,从pos开始到n的位置的元素替换为str
    string &replace(int pos,int n,const char *s);
    */

#include <iostream>
#include<string>
using namespace std;


void test4(){
    /*
    int find(const string &str,int pos=0) const;//查找str第一次出现的位置,从第pos位置开始查找
    int find(const char *s,int pos=0) const;//查找字符s第一次出现的位置,从pos位置开始查找
    int find(const char *s,int pos,int n) const;//从pos查找s的前n个字符在当前对象出现的位置
    int find(const char c,int pos=0) const;
    int rfind(const string &str,int pos=npos) const;//查找最后一次出现的位置
    int rfind(const char *s,int pos=npos) const;
    int rfind(const char *s,int pos,int n) const;
    int rfind(const char c,int pos=0) const;
    string &replace(int pos,int n,const string &str);//replace替换方法,从pos开始到n的位置的元素替换为str
    string &replace(int pos,int n,const char *s);
    */
    string str1="helllo,string";
    string str2="lll";
    int find1=str1.find(str2);
    int find2=str1.find("lll");
    int find3=str1.find("good",2,3);
    int find4=str1.find('h');
    int rfind5=str1.rfind(str2);//最后一次出现的位置,其实就是逆序查找
    int rfind6=str1.rfind("lll");
    int rfind7=str1.rfind("wow",1,2);
    int rfind8=str1.rfind('l');

    //替换replace
    string str3="replace functions";
    string str4="#########";
    str3.replace(2,4,str4);//从下标为2开始的元素到下标为4结尾的元素替换为str4的元素

    string str5="good study";
    str5.replace(2,4,"嗨");

    string str6="http://www.good.sex.666.sex.age.999.age.com.cn";//将sex和age敏感词屏蔽,sex用*,age用#
    while (1) {
       int ret=str6.find("sex");
       int ret1=str6.find("age");
       if(ret==-1&&ret1==-1){
           break;
       }
       str6.replace(ret,3,"***");
       str6.replace(ret1,3,"###");
    }

   //遍历
    cout<<find1<<endl;
    cout<<find2<<endl;
    cout<<find3<<endl;
    cout<<find4<<endl;
    cout<<rfind5<<endl;
    cout<<rfind6<<endl;
    cout<<rfind7<<endl;
    cout<<rfind8<<endl;

    cout<<str3<<endl;
    cout<<str5<<endl;
    cout<<str6<<endl;

}

int main()
{
    test4();//调用函数
    return 0;
}

输出结果:

七、string的比较操作

 /*
    compare方法在>返回1,<返回-1,==返回0;
    字符比较根据ASCII码表进行比较
    int compare(const string &s) const;
    int compare(const char *s) const;
    */ 

#include <iostream>
#include<string>
using namespace std;



void test5(){
    /*
    compare方法在>返回1,<返回-1,==返回0;
    字符比较根据ASCII码表进行比较
    int compare(const string &s) const;
    int compare(const char *s) const;
    */

    string str1("hello,string");
    string str2("helllo,string");
    if(str1.compare(str2)==0){
        cout<<"相等"<<endl;
    }
    else if(str1.compare(str2)>0){
        cout<<"str1大于str2"<<endl;
    }
    else{
        cout<<"str1小于str2"<<endl;
    }

    if(str2.compare("hello")==0){
         cout<<"相等"<<endl;
    }
    else if(str2.compare("hello")>0){
        cout<<"str2大于'hello'"<<endl;
    }
    else{
        cout<<"str2小于'hello'"<<endl;
    }


}

int main()
{
    test5();//调用函数
    return 0;
}

输出结果:

 tips:通过输出结果可知compare方法是逐个字符进行比较

八、string的子串、插入和删除操作

 /*
    string substr(int pos=0,int n=npos) const;//返回由pos开始的到n组成的字符串
    string &insert(int pos,const char *s);//从pos位置插入s
    string &insert(int pos,const string &str);
    string &insert(int pos,int n,char c);//指定的位置pos插入n个c
    string &erase(int pos,int n=npos);//删除从pos开始的n个元素
    */

#include <iostream>
#include<string>
using namespace std;


void test6(){
    /*
    string substr(int pos=0,int n=npos) const;//返回由pos开始的到n组成的字符串
    string &insert(int pos,const char *s);//从pos位置插入s
    string &insert(int pos,const string &str);
    string &insert(int pos,int n,char c);//指定的位置pos插入n个c
    string &erase(int pos,int n=npos);//删除从pos开始的n个元素
    */
    string str1="hello,string";
    string str2=str1.substr(2,3);
    cout<<str2<<endl;

    string str3="hello,you are welcome in my eye you are beautiful";
    int s=0;
    while (1) {
       int ret=str3.find(" ",s);//find方法如果查找到了,返回下标位置,查找不到返回-1
       if(ret==-1){
           cout<<str3.substr(s,str3.size()-s)<<endl;
           break;
       }
       cout<<str3.substr(s,ret-s)<<endl;
       s=ret+1;
    }

    string str4="hello,string";
    str4.insert(3,"######");
    cout<<str4<<endl;
    str4.insert(1,str1);
    cout<<str4<<endl;
    str4.insert(2,4,'H');
    cout<<str4<<endl;

    string str5="good,good,stud";
    str5.erase(3,4);//删除3到4位置的元素
    cout<<str5<<endl;
}

int main()
{
    test6();//调用函数
    return 0;
}

输出结果:

九、string的C风格和C++风格

/*
     * c语言中是没有string类型,因为string是类,是模板类,所以c语言使用指针来使用字符串
     * c++使用了C风格的字符串就是这么来的
     */ 

#include <iostream>
#include<string>
using namespace std;

void test7(){
    /*
     * c语言中是没有string类型,因为string是类,是模板类,所以c语言使用指针来使用字符串
     * c++使用了C风格的字符串就是这么来的
     */

    //C风格字符串
    const char *str1="hello,C_string";
    string str2=str1;
    cout<<str2<<endl;

    //c++风格字符串
    string str3="hello,C++_string";
    cout<<str3<<endl;

    //c++风格转换为c风格
    const char *str4=str3.c_str();
    cout<<str4<<endl;//使用c_str方法可以将c++对象转换为c语言风格的char指针类型
}

int main()
{
    test7();//调用函数
    return 0;
}

输出结果:

string类的使用介绍完毕啦。

真心耗时

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抽象是Java中的一种特殊,它不能被实例化,只能作为其他的基或父来被继承。抽象的主要目的是为了提供一种通用的抽象模板,定义了一些方法的签名(包括方法名、参数和返回类型),但没有具体的实现。子继承抽象后,必须实现抽象方法,才能创建该子的实例。 在Java中,我们使用`abstract`关键字来声明一个抽象。抽象可以包含普通方法、成员变量和构造方法,但不能包含私有的构造方法。抽象方法用`abstract`关键字来声明,并且不提供具体的实现。子必须实现父中的所有抽象方法,否则子也必须声明为抽象。 下面是一个简单的抽象的示例: ```java abstract class Shape { protected String color; public Shape(String color) { this.color = color; } public abstract double getArea(); } class Circle extends Shape { private double radius; public Circle(double radius, String color) { super(color); this.radius = radius; } @Override public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { private double side; public Square(double side, String color) { super(color); this.side = side; } @Override public double getArea() { return side * side; } } ``` 在上面的示例中,`Shape`是一个抽象,它有一个抽象方法`getArea()`,并且包含一个成员变量`color`和一个构造方法。`Circle`和`Square`继承自`Shape`,并实现了抽象方法`getArea()`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值