C++ | 自定义数据类型
定义Sales_data类型
12345struct Sales_data { std::string bookNo; unsigned units_sold = 0; double revenue = 0.0;};
类体右侧的表示结束的花括号后必须写一个分号,这是因为类体后面可以紧跟变量名以示对该对象的定义,所以分号必不可少;
1234struct Sales_data { /* ... */ } accum, trans, *salesptr;// 与上一条语句等价,但可能更好一些struct Sales_data { /* ... */ };Sales_data accum, trans, *salesptr;
为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应与类的名字一样。例如,库类型string在名为string的头文件中定义。又如,我们应该把Sales_data类定义在名为Sales_data.h的头文件中。
C++ | 引用
什么是引用
引用为对象起了另外一个名字,引用类型引用另外一种类型。
12int ival = 1024;int &refVal = ival;
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。
C++ | 数组
数组的大小确定不变,不能随意向数组中添加元素。
如果不清楚元素的确切个数,使用vector
定义和初始化
数组的声明形如 a[d],其中a是数组的名字,d是数组的维度,其中数组的维度d必须是常量表达式。
123456unsigned cnt = 42; // 不是常量表达式constexpr unsigned sz = 42; // 常量表达式,关于constexprint arr[10]; // 含有10个整数的数组int *parr[sz]; // 含有42个整型指针的数组string bad[cnt]; // 错误:cnt不是常量表达式string strs[get_size()]; // 当get_size是constexpr时正确;否则错误
不允许拷贝和赋值
不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值
123int a[] = {0, 1, 2}; int a2[] = ...
C++ | 声明与定义
背景
一个文件的代码使用另一个文件中定义的变量。
123extern int i; //声明i而非定义iint j //声明并定义jextern double pi = 3.14 //定义
如果要在多个文件中使用同一个变量,就必须将声明和定义分离。
C++ | 迭代器
迭代器有有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位置,其它情况都属于无效
使用迭代器
12// b表示v的第一个元素,e表示v尾元素的下一位置auto b = v.begin(), e = v.end(); // b和e的类型相同
end成员则负责返回指向容器(或string对象)“尾元素的下一位置(one past the end)”的迭代器,也就是说,该迭代器指示的是容器的一个本不存在的“尾后( off the end)”元素。这样的迭代器没什么实际含义,仅是个标记而已,表示我们已经处理完了容器中的所有元素。end成员返回的迭代器常被称作尾后迭代器( off-the-end iterator) 或者简称为尾迭代器(end iterator)。 特殊情况下如果容器为空,则begin和end返回的是同一个迭代器。
迭代运算符
123456*iter // 返回迭代器iter所指无素的引用iter- >mem // 解引用iter并获取该元素的名为mem的成员,等价于(*iter) . mem+ ...
C++ | 处理类型
类型别名
类型别名是一个名字,它是某种类型的同义词
12typedef double wages; // wages是double的同义词typedef wages base, *p; // base是double的同义词,p是double*的同义词
新标准规定了一种新的方法,使用别名声明来定义类型的别名:
1using SI = Sales_item; // SI是Sales_item的同义词
指针、常量和类型别名
123typedef char *pstring;const pstring cstr = 0; // cstr是指向char的常量指针const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针
注:
1const char *cstr = 0; // 是对const pstring cstr的错误理解
auto类型说明符
auto类型说明符,可以让编译器替我们去分析表达式所属的类型。
1auto item = val1 + val2; // item初始化为val1与val2相加的结果。
aut ...