1.string类
a.包含头文件 <string>
string s1; 定义的时候没有初始化,默认是空;
string s2 = "c plus"; 定义并初始化 c plus ,没有\0;
string s3 = s2; 定义s3,并把s2赋值给s3;
string s4 (3, 's'); 初始化为3个s;
string 输入时,cin是遇到空格默认结束;
string成员可以用下标访问;从0开始;
b. string 中字符串可以使用+, +=进行字符串的拼接;
c. string插入操作,insert
原型: string& insert(size_t pos, const string &str)
d.string删除操作:erase
原型:string& erase(size_t pos = 0, size_t length)
s2.erase(5);把s2第5个元素后面的内容全部删除;
s3.erase(5, 3);s3中第5个后面3个元素删除
e .string中substr
string substr (size_t pos = 0, size_t len = npos) const;
pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。
s2 = s1.substr(3, 10);从第3个开始提取10给s2;
f。string查找find查找出现的位置:
其中的两种原型为:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
string s1; 定义的时候没有初始化,默认是空;
string s2 = "c plus"; 定义并初始化 c plus ,没有\0;
string s3 = s2; 定义s3,并把s2赋值给s3;
string s4 (3, 's'); 初始化为3个s;
string 输入时,cin是遇到空格默认结束;
string成员可以用下标访问;从0开始;
b. string 中字符串可以使用+, +=进行字符串的拼接;
c. string插入操作,insert
原型: string& insert(size_t pos, const string &str)
d.string删除操作:erase
原型:string& erase(size_t pos = 0, size_t length)
s2.erase(5);把s2第5个元素后面的内容全部删除;
s3.erase(5, 3);s3中第5个后面3个元素删除
e .string中substr
string substr (size_t pos = 0, size_t len = npos) const;
pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。
s2 = s1.substr(3, 10);从第3个开始提取10给s2;
f。string查找find查找出现的位置:
其中的两种原型为:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
补充:转换为C风格的字符串
虽然 C++ 提供了 string 类来替代C语言中的字符串,但是在实际编程中,有时候必须要使用C风格的字符串(例如打开文件时的路径),为此,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。请看下面的代码:
string path = "D:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");
为了使用C语言中的 fopen() 函数打开文件,必须将 string 字符串转换为C风格的字符串.
虽然 C++ 提供了 string 类来替代C语言中的字符串,但是在实际编程中,有时候必须要使用C风格的字符串(例如打开文件时的路径),为此,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。请看下面的代码:
string path = "D:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");
为了使用C语言中的 fopen() 函数打开文件,必须将 string 字符串转换为C风格的字符串.
2.c++中的引用。
引用是变量的一个别名,通过这个别名和原来的名字都可以找到这份数据。一个人的名字和绰号,表示同一个人。
1。引用和变量
<类型> &name = data;
引用必须在定义的时候同时初始化,后面不能再引用其他数据,类似于const
;
#include <iostream>
using namespace std;
int main()
{
int a = 99;
int &b = a;
cout<<a<<","<<b<<endl;
cout<<&a<<","<<&b<<endl;
return 0;
}
引用在定义的时候加&,使用的时候不用,加&表示地址。
不希望引用修改数据,就在前面加const
;
const <类型> &name = data;或
<类型> const &name = data;
就是用const保护数据。
2。引用作为函数参数
用引用作为形参,调用时形参和实参就绑定在一起,指向同一份数据,如同C中的地址传递。
修改形参,实参也改变,不会出现C中数值传递的时候实参不改变。
<类型> &name = data;
引用必须在定义的时候同时初始化,后面不能再引用其他数据,类似于const
;
#include <iostream>
using namespace std;
int main()
{
int a = 99;
int &b = a;
cout<<a<<","<<b<<endl;
cout<<&a<<","<<&b<<endl;
return 0;
}
引用在定义的时候加&,使用的时候不用,加&表示地址。
不希望引用修改数据,就在前面加const
;
const <类型> &name = data;或
<类型> const &name = data;
就是用const保护数据。
2。引用作为函数参数
用引用作为形参,调用时形参和实参就绑定在一起,指向同一份数据,如同C中的地址传递。
修改形参,实参也改变,不会出现C中数值传递的时候实参不改变。
#include <iostream>
using namespace std;
void swap1(int a, int b);
void swap2(int *a, int *b);
void swap3(int &a, int &b);
int main()
{
int n1, n2;
cin>>n1>>n2;
swap1(n1, n2);
cout<<n1<<" "<<n2<<endl;
cin>>n1>>n2;
swap2(&n1, &n2);
cout<<n1<<" "<<n2<<endl;
cin>>n1>>n2;
swap3(n1, n2);
cout<<n1<<" "<<n2<<endl;
return 0;
}
void swap1(int a, int b) //直接传递参数内容
{
int temp = a;
a = b;
b = temp;
cout<<a<<" "<<b<<endl;
}
void swap2(int *a, int *b) //传递指针
{
int temp = *a;
*a = *b;
*b =temp;
cout<<*a<<" "<<*b<<endl;
}
void swap3(int &a, int &b) //按引用传参 a,b分别绑定num1,num2了
{
int temp = a;
a = b;
b = temp;
cout<<a<<" "<<b<<endl;
}
3。引用作为函数返回值
#include <iostream>
using namespace std;
int &sum(int &num)
{
num = num +1;
return num;
}
int main()
{
int n = 20;
int m = sum(n);
cout<<m<<endl;
return 0;
}
注意:不能返回局部变量的引用;
4。引用的本质,和指针的区别
引用只是对指针进行了封装,底层还是通过指针实现的。
4.1 引用必须在定义时初始化,从一而终,不能指向其他数据;
指针没这个限制,不一定赋值,也能指向任意数据。
4.2 可以有const指针,但是没有const引用;
int a = 20;
int & const r = a; error
const int *const ptr ;
多此一举
3. 指针可以有多级:int **p;但引用int &&p是错误的;
可以如下:
int a = 10;
int &r = a;
int &rr = r;
4. 指针和引用的自增++,自减--表示不一样。
指针表示指向的地址发生改变,指向下一个单元;
引用表示指向的值改变;
char a='c' ; --- &a = 0x10000000;
char *ptr=&a;
ptr++;
ptr--;
0x100000000;
int a = 3;
int &b= a;
b++;
b--;
4。引用的本质,和指针的区别
引用只是对指针进行了封装,底层还是通过指针实现的。
4.1 引用必须在定义时初始化,从一而终,不能指向其他数据;
指针没这个限制,不一定赋值,也能指向任意数据。
4.2 可以有const指针,但是没有const引用;
int a = 20;
int & const r = a; error
const int *const ptr ;
多此一举
3. 指针可以有多级:int **p;但引用int &&p是错误的;
可以如下:
int a = 10;
int &r = a;
int &rr = r;
4. 指针和引用的自增++,自减--表示不一样。
指针表示指向的地址发生改变,指向下一个单元;
引用表示指向的值改变;
char a='c' ; --- &a = 0x10000000;
char *ptr=&a;
ptr++;
ptr--;
0x100000000;
int a = 3;
int &b= a;
b++;
b--;