c++学习笔记(二)—— 变量和基本类型
变量和基本类型
字面值
数字
字面值就是常量。十进制字面值没有负数,比如-42,他的含义是对42取负值
十进制字面值类型:int, long, long long(最小的那个)
八进制和十六进制:int, unsigned int, long, unsigned long, long long, unsigned long long
指定字面值
前缀 | 含义 | 类型 |
---|---|---|
u | unicode 16字符 | char16_t |
U | unicode 8字符 | char8_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串常量) | char |
后缀 | 自小匹配类型 |
---|---|
整型 | - |
u or U | unsigned |
l or L | long |
ll or LL | long long |
浮点型 | - |
f or F | float |
l or L | long double |
string != 字面值
string s5 = "world"
string s6 = "hello" + "," + s5; // 错误,不能把字面值直接相加
string可以和字面值相加返回string,而字面值不可以。在c++里,字面值不等于string
字符
单引号表示单独的字符,双引号表示字符串型字面值
区别:字符串型的字面值,后面会加个'\0'的空字符
tips:赋值的含义是吧对象的当前值擦除,而以一个新值来替代
访问全局定义域
int res = 42
int main()
{
cout << res << endl; // 输出42
int res = 10;
cout << res << endl; // 输出10
cout << ::res << endl; // 输出42
}
引用
引用没有创建一个新的变量,而是给被引用的对象换个名字
数组引用形参
void print(int (&arr)[3]) {};
int i = 0, j[2] = {0, 1};
int k[3] = {0, 1, 2};
print(j); //错误,长度不同
print(k); //正确
指针
指针存放的是某个对象的地址,&代表取地址符
int *p = &val
顶层const:表示指针本身是个常量
底层const:表示指针所指的对象是一个常量
void*
一种特殊的指针,可用于存放任意对象的地址,但是相对的,不能直接操作指向的对象。
简单来说,只能对内存空间的值修改,而不能改变指向的值
可以用作函数的输入和输出、用来和其他指针比较。
智能指针
- shared_ptr: 允许多个指针指向同个对象
- unique_ptr: 独占所指的对象
- weak_ptr: 弱引用
注意点:unique_ptr的release操作不会释放所指的对象,而是放弃对指针的控制权,返回指针。
unique支持管理动态数组,但是shared不支持:
unique_ptr<T[]> u;
u[i]; // 返回u拥有的数组中位置i处的对象
函数指针
int (*fp)(int i, int j) = add;
function<int(int, int)> pp = fp;
迭代器
插入迭代器
- back_inserter: 创建使用push_back的迭代器
- front_inserter: 创建使用front_back的迭代器
- inserter: 创建使用insert的迭代器
auto it = back_inserter(c, iter);
*it = val;
/*
等价于
it = c.insert(it, val);
++it;
*/
流迭代器
- istream_iterator
- ostream_iterator
ostream_iterator<int> out_iter(cout, " ");
for(auto e : vec)
*out_iter++ = e;
cout << endl;
反向迭代器
向后移动而不是向前,除了forward_list都有
移动迭代器
不是拷贝,而是移动
auto first = alloc.allocate(100000);
uninitialized_copy(
make_move_iterator(begin()),
make_move_iterator(end()),
first
)
其他标准库类型
size_t
cstddef中的类型,用来表示数组大小
ptrdiff_t
cstddef中的类型,用来表示指针的距离