《C++ Primer(第五版)》知识巩固
运行平台:ubuntu 12.04/GCC 4.8.0
第二章:基本内置类型
1.decltype类型指示符
当我们从表达式的类型来推断要定义的类型时,可以使用decltype()来解析;decltype与auto不同,decltype应用于变量,返回该变量的类型。
string s("Hello World!!!"); // punct_cnt has the same type that s.size returns decltype(s.size()) punct_cnt = 0;
2.转义序列
\xxx 八进制
\x(xxx) 十六进制
unsigned char c = -1; // assuming 8-bit chars, c has value 255 i = c; // the character with value 255 is an unprintable character // assigns value of c (i.e., 255) to an int std::cout << i << std::endl; // prints 255
unsigned u = 10; int i = -42; std::cout << i + i << std::endl; // prints -84 std::cout << u + i << std::endl; // if 32-bit ints, prints 4294967264
3.getline()的使用
string line; // read input a line at a time until end-of-file while (getline(cin, line)) cout << line << endl;
4.str.size()返回为string::size_type类型,这是标准库与机器无关的特性之一。
如下面这个例子,输入大小在0-15之间的数字,求其对应的十六进制符号:
const string hexdigits = "0123456789ABCDEF"; // possible hex digits cout << "Enter a series of numbers between 0 and 15" << " separated by spaces. Hit ENTER when finished: " << endl; string result; // will hold the resulting hexify'd string string::size_type n; // hold numbers from the input while (cin >> n) if (n < hexdigits.size()) // ignore invalid input result += hexdigits[n]; // fetch the indicated hex digit cout << "Your hex number is: " << result << endl;
而与之相关的则是size_t类型,size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。
#include <cstddef> using std::size_t; constexpr size_t rowCnt = 3, colCnt = 4; int ia[rowCnt][colCnt]; // 12 uninitialized elements // for each row for (size_t i = 0; i != rowCnt; ++i) { // for each column within the row for (size_t j = 0; j != colCnt; ++j) { // assign the element's positional index as its value ia[i][j] = i * colCnt + j; } }
第四章:表达式
1.值的溢出
思考下面运算的结果:
short short_value = 32767; // max value if shorts are 16 bits short_value += 1; // this calculation overflows cout << "short_value: " << short_value << endl;
第六章:函数
1.返回数组指针的函数,这三种表达方式,留意:
int *p = elemPtr(6); // p points to an int int (*arrP)[5] = arrPtr(5); // arrP points to an array of five ints int (&arrR)[5] = arrRef(4); // arrR refers to an array of five ints / two arrays int odd[] = {1,3,5,7,9}; int even[] = {0,2,4,6,8}; // function that returns a pointer to an int in one of these arrays int *elemPtr(int i) { // returns a pointer to the first element in one of these arrays return (i % 2) ? odd : even; } // returns a pointer to an array of five int elements decltype(odd) *arrPtr(int i) { return (i % 2) ? &odd : &even; // returns a pointer to the array } // returns a reference to an array of five int elements int (&arrRef(int i))[5] { return (i % 2) ? odd : even; }
2.含有可变参数的函数
在C11中提供了两种方法:如果参数类型相同,可以传递一个名为initializer_list的标准库类型;如果类型不同,可以使用可变参数模版,见16章。使用方法如下:
// overloaded version takes only a list of strings void error_msg(initializer_list<string> il) { for (auto beg = il.begin(); beg != il.end(); ++beg) cout << *beg << " " ; cout << endl; } string expected = "description", actual = "some other case"; initializer_list<int> li = {0,1,2,3}; // expected, actual are strings if (expected != actual) error_msg({"functionX", expected, actual}); else error_msg({"functionX", "okay"});
3.函数指针
C11中尾置返回类型,如声明如下:
// use trailing return type auto getFcn(const string&) -> string::size_type(*)(const string&, const string&);
而函数指针的另外两种声明定义,一种是()括号解析,另一种则是借用decltype确定返回类型为函数指针类型,使用如下:
decltype(sumLength) *getFcn(const string &); // direct definition string::size_type (*getFcn(const string&))(const string&, const string&); // define getFcn decltype(sumLength)* getFcn(const string &fetch) { if (fetch == "sum") return sumLength; return largerLength; }