一. C++基本变量类型
- 基本类型:
int、double
等。 - 复合类型:引用、指针、
const
等。 - 标准库类型:
string
(可变长字符串的处理)、vector
(一种集合或容器的概念)、迭代器。
对于字符串,在现实生活中,string
字符串无处不在。包括我们说的每一句话,例如,baidu.com
,甚至写的文字也算是字符串的一种。
二. String对象的定义和初始化
① 使用string
类型前要
#include <string> using namespace std; //不包含该命名空间的话,需要使用std::string声明
② 定义和初始化string
对象
string s1; //默认初始化,s1 = “”,表空串,里面没有字符 string s2("I Love China"); //把I Love China这个字符串内容拷贝到了s2代表的一段内存中,拷贝时不包括末尾的\0(字符串常量末尾默认有一个\0) string s3 = "I Love China"; //跟s2的写法效果一样 string s4 = s2; //把s2中的内容拷贝到了s4代表的一段内存中,但两者内存地址不同 string s5(3, 'a'); //把s5初始化为连续3个字符‘a’组成的字符串,即s5 = “aaa”,这种方式不太推荐,因为会在系统内部创建临时对象,有点影响效率
三. String对象的操作
① 判断是否为空empty()
,返回bool
类型
std::string s1; if(s1.empty()) { //字符串s1为空成立 }
② size()
或length()
:返回字节/字符数量,代表该字符串的长度(unsigned int
)
string s1; qDebug() << "s1的字符长度:" << s1.size(); //s1的字符长度:0 qDebug() << "s1的字符长度:" << s1.length(); //s1的字符长度:0 string s2 = "我是牛马!"; qDebug() << "s2的字符长度:" << s2.size(); //s2的字符长度:9 qDebug() << "s2的字符长度:" << s2.length(); //s2的字符长度:9
③ s[n]
:返回s
中的第n
个字符(n
是个整型值),n
代表的是一个位置,位置从0
开始,到.size()-1
结束
string s4 = "I Love China!"; if(s4.size() > 4) { qDebug() << "s4[4] = " << s4[4]; //s4[4] = v s4[4] = 'w'; qDebug() << "s4 = " << s4; //s4 = "I Lowe China!" }
④ s1+s2
:字符串的连接,返回连接后的结果,其实就是得到一个新的string
对象
string s5 = “abcd”; string s6 = “abcd”; string s7 = s5 + s6; qDebug() << "s7 = " << s7; //s7 = "abcdabcd"
⑤ s1 = s2
:字符串对象赋值,s1
里的内容被s2
里面的内容所取代。
⑥ s1 == s2
:判断两个字符串是否相等(长度+字符同),大小写敏感(大小写字符是两个不同的字符)。
⑦ s.c_str()
:将string
类型转换成const char *
。
string s8 = "abc"; const char *p = s8.c_str(); //p指向s8的内存地址,内容也是"abc" char str[100]; strcpy_s(str, sizeof(str), p); qDebug() << "str = " << str; //str = "abc"
.c_str
的引入是为了与C
语言兼容,在C
语言中没有string
类型,所以我们得通过string
类对象的c_str()
成员函数把string
对象转换成C
语言中的字符串样式。
我们在研究研究这段函数里面的内存情况,感兴趣的可以看看:
通过在内存窗口输入&s8
,得到s8
的内存地址为0x010FFC6C
(打开内存窗口方式:调试——窗口——内存——内存)
内存地址0x010FFC6C
中结尾6C
代表上面右边内存???.abc.???
中的第一位,而const char *p = s8.c_str();
中指针p
指向s8
中字符串真正的内存地址,所以应该是从6C
开始跳过4位的a
开始,所以指针p
的内存地址为0x010ffc70
(6C
到70
相差就是4
字节)。
strcpy_s(str, sizeof(str), p);
将指针p
中的内存赋值给字符数组str
,其内的61 62 63
代表abc
,00
代表结束符/0
。
ps:因为对象中可能包含其他东西,所以内存中的?
或其他乱码是正常的。
⑧ 针对string
使用范围for语句
范围for:C++11
中提供的一种能够遍历一个序列中的每一个元素的方法。
string s9 = "I Love China"; for(auto c : s9) //auto:编译器自动推断变量c的类型,并为其不断分配内存,直到遍历结束 { qDebug() << c; //依次输出s9里面的内容 }
利用范围for
语句,修改string
中的内容
string s9 = "I Love China"; for(auto &c : s9) //这里使用取地址符号,即c相当于s9中内容的别名,直接取代 { c = toupper(c); //因为c是一个引用,所以这相当于改变s9中的值 //toupper():把小写字符转成大写,大写字符没变化 qDebug() << c; //输出:I LOVE CHINA }
注:for(auto c : s9)
和for(auto &c : s9)
相比,更推荐后置,引用方式更高效。
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |