string标准库和size_type问题
小弟是java程序员,最近心血来潮打算学学c++,结果有几个概念实在掰扯不清。
1.《c++ +Primer》上说,标准库string类型和字面量的字符串类型不是同一种类型,为什么字符串字面量可以直接对标准库string类型的变量赋值?
2. 《c++ +Primer》73页中,说道string::size_type类型的时候,明确说size_type不是int类型也不是unsigned int类型,但是下面的几个段落中又提到根据无符号变量一般的上限是有符号变量上限的两倍,推导出size_type的上限是int上限的两倍,这个结论从何而来?
谢谢大家!!
[解决办法]
1. 因为 std::string 有接受 string literal 的构造函数。
2. 没看明白,楼主还是把原文发上来吧。
[解决办法]
1.《c++ +Primer》上说,标准库string类型和字面量的字符串类型不是同一种类型,为什么字符串字面量可以直接对标准库string类型的变量赋值?
std::string str_hello = "ni hao";
你说的是这种吗?调用的是std::string的拷贝构造函数,来生成std::string对象的。
std::string str_say;
str_say = str_hello;
调用的std::string的赋值运算函数将 str_hello的字符串 赋值给 str_say。
自己实现一个string类 你就明白了
2.c++ +Primer》73页中,说道string::size_type类型的时候,明确说size_type不是int类型也不是unsigned int类型,但是下面的几个段落中又提到根据无符号变量一般的上限是有符号变量上限的两倍,推导出size_type的上限是int上限的两倍,这个结论从何而来?
我看不太懂这是要问啥?
比如 8位二进制 所能表示的有符号数范围 -128 ~ 127
那么 无符号数 就是 0 ~ 255
基本就是两倍啊, 这跟 size_type不是int也不是unsigned int 有啥关系
[解决办法]
转载原文:
string 类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type就是这些配套类型中的一种。它定义为与 unsigned 型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意 string 对象的长度。
虽然我们不知道 string::size_type 的确切类型,但可以知道它是 unsigned 型(2.1.1 节)。对于任意一种给定的数据类型,它的 unsigned 型所能表示的最大正数值比对应的 signed 型要大倍。这个事实表明 size_type 存储的 string 长度是 int 所能存储的两倍。
------解决方案--------------------
不要被误导了,这里不是拷贝构造函数
[解决办法]
书中的描述有些问题而已,那里的int本来应该写作signed的
size_type确实不能等同于unsigned类型。size_type或者size_t被规定对应于当前平台上与指针同位宽对应的整数类型。而普通的int、long、longlong等均不具有这样的特征,往往比实际的整形或长或短,这样用于内存分配就可能会引起一些问题(申请的内存超过虚拟内存地址范围的总大小?或者设置到普通整形的最大值也远远达不到虚拟内存大小?比如64位平台上size_type的宽度为64位,但是int和long的宽度却为32位的。longlong可用可是却又不适用于32位平台的虚拟内存地址范围),另外通过换用自定义的traits,size_type还可能被指定一个整形类,即用一个类模拟整数的行为
普通的整形,同宽的有符号数最高位被拿掉当作符号位用了,所以比无符号数的范围少了接近一半