zoukankan      html  css  js  c++  java
  • 《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;
    }
    

                                                                                                                  

  • 相关阅读:
    SQL通配符
    全角半角内容转换
    使用merge into 来更新目标表的个别字段
    数据库分库分表思路
    impdp导入错误ORA-14460
    CentOS只有GNOME桌面,没有GNOME经典桌面
    sqlserver进行发布订阅时提示实例上未安装复制组件解决方法
    SQLSERVER发布订阅,超详细
    sqlserver查询锁以及解锁
    sqlserver调用java文件
  • 原文地址:https://www.cnblogs.com/sansan/p/3434294.html
Copyright © 2011-2022 走看看