• C++ Primer学习笔记-----第二章:变量和基本类型


    2.1:
    基本内置类型:算术类型和空类型(void)。
    算术类型:整形(包括字符、布尔)和浮点型。

    字符型分为三种:char、signed char、unsigned char
    char和signed char并不一样,尽管字符型有三种,但字符的表现形式只有两种:带符号和无符号的。
    类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。

    切勿混用带符号类型和无符号类型

    2.2:
    定义在函数体内部发内置类型变量不被初始化,定义域任何函数体之外的变量被初始化为0。

    变量只能被定义一次,可以被多次声明。
    extern int a; //声明a
    int a; //声明并定义a
    extern int a=1; //定义a

    2.3:复合类型(引用和指针):基本数据类型,紧随其后的一个声明符列表组成。

    引用:
    int a=1;
    int &b=a;

    引用并非对象,只是为一个已经存在的对象所起的另外一个名字。
    引用本身不是一个对象,所以不能定义引用的引用。
    引用在定义是必须初始化

    指针:
    指针本身是一个对象,无须在定义时赋初值,在块作用域内顶一顶指针如果没有被初始化,用于一个不确定的值

    int a=1;
    int *b=&a;

    空指针:
    int *a=nullptr; //c++11
    int *b=0;
    int *c=NULL;//内部还是0,和第二种一样,预处理后NULL会被替换为0

    void*指针:用于存放任意对象的地址

    指向指针的引用
    int *a=0;
    int &b=a; //b是一个对指针a的引用
    要判断b的类型:从右往左阅读b的定义。
    离变量名最近的符号对变量有最直接的影响,因此b是一个引用。
    声明符的其余部分用以确定b引用的类型是什么,此例中的符号
    说明b引用的是一个指针。
    最后声明的基本数据类型部分指出b引用的是一个int指针。

    2.4:const限定符
    int a=1;
    const int b=1;//b的值不能更改
    const int c=&a;//不能通过c修改值
    const int * const d=&a; //不能通过*d修改值,d的指针的值也不能修改
    const int &e=a; //不能通过e修改值

    constexpr:由编译器来验证变量的值是否是一个常量表达式。
    constexpr int a=5;
    constexpr int b=Size(); //Size()函数必须有constexpr修饰

    constexpr int Size()
    {
    return 1;
    }

    constexpr声明中如果定义了指针,仅对指针有效。
    int a=1;
    constexpr int *b=&a; //b指针不能修改
    等于int * const b=&a;

    2.5:处理类型
    类型别名:两种方式
    1.typedef double a,b,*c; //可以用多个别名
    2.using a=double; //别名声明(c++11)

    typedef char *ch;
    const ch a=0; //a是指向char的常量指针
    const ch *b; //b是一个指针,它的对象是指向char的常量指针

    auto:会忽略顶层const,保留底层const
    顶层const(指针本身是个常量),顶层const可以表示任意的对象是常量,对任何数据类型都使用。
    底层const(指针所指的对象是个常量),底层const与指针和引用等复合类型的基本类型部分有关。

    int x=0;
    const int a=x, &b=a; //a的值不能修改
    auto c=a; //c是一个整数(const被忽略掉,可以修改c值)
    auto d=b; //d是一个整数(b是a的别名,忽略const)
    auto e=&x; //e是一个整型指针
    auto f=&a; //f是一个指向整数常量的指针,不能修改f指向的值
    const auto g=a; //手动添加const

    设置一个类型为auto的引用时,初始值中的顶层常量属性保留
    auto &h=a; //h是一个整型常量引用,绑定到a,不行修改h的值
    auto &i=33;//错误:不能为非常量引用绑定字面值
    const auto &j=33; //正确:可以为常量引用绑定字面值

    一条语句中定义多个变量,初始值必须是同一种类型
    auto &m=1,*n=1.5; //错误,推导出不是同一种类型

    decltype类型指示符(C++11)
    返回操作数的数据类型,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
    decltype(f()) sum=x;

    处理变量时,decltype返回该变量的类型
    const int a=0,&b=a;
    decltype(a) x=0; //x的类型是const int
    decltype(b) y=x; //y的类型是const int&,y绑定到变量x
    decltype(b) z; //错误:z是一个引用,必须初始化

    处理表达式时,如果表达式的内容是解引用操作,则decltype将得到引用类型
    int i=42,*p=&i,&r=i;
    decltype(r+0) b; //正确:加法的结果是int,b是一个未初始化的int
    decltype(*p) c; //错误:c是int&,必须初始化

    decltype和auto的另一处重要区别是,decltype的结果类型与表达式形式密切相关,有一种情况需要特别注意:
    对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。
    如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上一层或多次括号,编译器就会把它当成是一个表达式,这样的decltype就会得到引用类型。

    decltype((i)) d; //错误:d是int&,必须初始化
    decltype(i) e; //正确:e是一个未初始化的int

    decltype((variable))(注意是双括号)的结果永远是引用。
    decltype(variable) 结果只有当variable本身就是一个引用时才是引用。

    2.6.自定义数据结构

    类定义的最后加上分号,因为类体后面可以紧跟变量名以示对该类型对象的定义,所以分号必不可少
    struct MyData{/* */} a,b,*c;

    和上面等价,下面的形式会更好
    struct MyData{/* */};
    MyData a,b,*c;

    头文件避免重复包含

    #ifndef SALES_DATA_H
    #define SALES_DATA_H
    
    struct MyStruct
    {
    	int num;
    };
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    JavaScript原型模式:实现对象共享属性和方法!
    科技云报道:押注向量数据库,为时过早?
    分布式缓存Spring Cache
    l8-d19 广播与组播
    salesforce零基础学习(一百三十二)Flow新功能: Custom Error
    探索AI交互:Python与ChatGPT的完美结合!
    练习4
    策略模式在数据接收和发送场景的应用(升级版)
    【LeetCode】2319. 判断矩阵是否是一个X矩阵
    18105 银行的叫号顺序
  • 原文地址:https://blog.csdn.net/weixin_41155760/article/details/125555417