• C++程序设计(第4版)读书笔记_类型与声明


    字符类型

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     cout << '0' + 2 << endl;
     8     cout << static_cast<char>('0' + 2) << endl;
     9     
    10     return 0;
    11 }

    运行结果:

    注意类型转换

    再谈auto

    1、在使用auto自动推断变量类型时,没有必要采用列表初始化“{}”的方式,而是直接用“=”就好了

    2、在较小的作用域中建议优先使用auto

     1 template<class T> void f1(vector<T> & arg)
     2 {
     3     for (vector<T>::iterator p = arg.begin(); p != arg.end(); ++p) {
     4         * p =7;
     5     }
     6   
     7     for (auto p = arg.begin(); p != arg.end(); ++p) {
     8         * p =7;
     9     }   
    10 }

    很明显,第二种方法要好,第一书写要少,第二如果把vector改为了list,第二种方法也能适配

    再谈列表初始化

    以vector来举例

    vector<int> v1 {99}; //v1包含1个元素,该元素值为99
    vector<int> v2 (99); //v2包含99个元素,每个元素都取默认值0
    vector<string> v1 {"hello"}; //v1含有1个元素,该元素值为"hello"
    vector<string> v2 ("hello"); //错误:vector的任何构造函数都不接受字符串字面值常量作为参数

    因此,除非有充分的理由,否则最好使用{}初始化

    下面再给出一些例子:

    1 int x4 {}; //x4被赋值为0
    2 double d4 {}; //d4被赋值为0.0
    3 char buf[1024] {}; //对于任意i,buf[i]的值为0
    4 char * p {}; //p被赋值为nullptr
    5 int * p {new int{10}}; //* p的值变为10
    6 char * q {new char[1024] {}}; //对于任意i,q[i]的值变为0
    7 vector<int> v4 {}; //v4被赋值为一个空向量
    8 string s4 {}; //s4被赋值为""

    decltype

    1、decltype意义

    有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

    2、decltype用法

    (1)基本用法

     1 int getSize();
     2 
     3 int main(void)
     4 {
     5     int tempA = 2;
     6     
     7     /*1.dclTempA为int*/
     8     decltype(tempA) dclTempA;
     9     /*2.dclTempB为int,对于getSize根本没有定义,但是程序依旧正常,因为decltype只做分析,并不调用getSize,*/
    10     decltype(getSize()) dclTempB;
    11 
    12     return 0;
    13 }

    (2)与const结合

        double tempA = 3.0;
        const double ctempA = 5.0;
        const double ctempB = 6.0const double *const cptrTempA = &ctempA;
        
        /*1.dclTempA推断为const double(保留顶层const,此处与auto不同)*/
        decltype(ctempA) dclTempA = 4.1;
        /*2.dclTempA为const double,不能对其赋值,编译不过*/
        dclTempA = 5;
        /*3.dclTempB推断为const double * const*/
        decltype(cptrTempA) dclTempB = &ctempA;
        /*4.输出为4(32位计算机)和5*/
        cout<<sizeof(dclTempB)<<"    "<<*dclTempB<<endl;
        /*5.保留顶层const,不能修改指针指向的对象,编译不过*/
        dclTempB = &ctempB;
        /*6.保留底层const,不能修改指针指向的对象的值,编译不过*/
        *dclTempB = 7.0;

    (3)与引用结合

        int tempA = 0, &refTempA = tempA;
    
        /*1.dclTempA为引用,绑定到tempA*/
        decltype(refTempA) dclTempA = tempA;
        /*2.dclTempB为引用,必须绑定到变量,编译不过*/
        decltype(refTempA) dclTempB = 0;
        /*3.dclTempC为引用,必须初始化,编译不过*/
        decltype(refTempA) dclTempC;
        /*4.双层括号表示引用,dclTempD为引用,绑定到tempA*/
        decltype((tempA)) dclTempD = tempA;
        
        const int ctempA = 1, &crefTempA = ctempA;
        
        /*5.dclTempE为常量引用,可以绑定到普通变量tempA*/
        decltype(crefTempA) dclTempE = tempA;
        /*6.dclTempF为常量引用,可以绑定到常量ctempA*/
        decltype(crefTempA) dclTempF = ctempA;
        /*7.dclTempG为常量引用,绑定到一个临时变量*/
        decltype(crefTempA) dclTempG = 0;
        /*8.dclTempH为常量引用,必须初始化,编译不过*/
        decltype(crefTempA) dclTempH;
        /*9.双层括号表示引用,dclTempI为常量引用,可以绑定到普通变量tempA*/
        decltype((ctempA))  dclTempI = tempA;

    (4)与指针结合

        int tempA = 2;
        int *ptrTempA = &tempA;
        /*1.常规使用dclTempA为一个int *的指针*/
        decltype(ptrTempA) dclTempA;
        /*2.需要特别注意,表达式内容为解引用操作,dclTempB为一个引用,引用必须初始化,故编译不过*/
        decltype(*ptrTempA) dclTempB;

    3、decltype总结

    decltype和auto都可以用来推断类型,但是二者有几处明显的差异:

    (1)auto忽略顶层const,decltype保留顶层const;

    (2)对引用操作,auto推断出原有类型,decltype推断出引用;

    (3)对解引用操作,auto推断出原有类型,decltype推断出引用;

    (4)auto推断时会实际执行,decltype不会执行,只做分析。

    ps:关于auto和decltype,后续再详细补充

    本文部分参考自:

    http://www.cnblogs.com/cauchy007/p/4966485.html

  • 相关阅读:
    SpringXML方式配置bean的懒加载lazy-init
    jQuery实现select三级联动
    jQuery实现导航栏
    jQuery实现点击式选项卡
    jQuery对象和dom对象
    jQuery插件
    Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project Resource: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
    Java、Apache Tomcat下载与安装及环境变量配置
    Notepad++怎么增加整行删除快捷键?添加/取消区块注释?
    org.apache.catalina.core.DefaultInstanceManager cannot be cast to org.apache.tomcat.InstanceManager
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7771383.html
Copyright © 2020-2023  润新知