zoukankan      html  css  js  c++  java
  • C++基础知识--DAY2

    昨天我们主要是讲的C++相对于C语言的变化,结尾讲述了一点引用的基础知识,要明白,引用就是对一个变量取别名,在C++中需要用指针的都可以思考是否可以用引用来代替。

    1. 常引用

    常引用(const semantic),const定义的变量成为常变量,常量的形式,常量的作用,用作常量。常用作取代#define宏常量,声明为const引用,则不可以通过const修改数据

    2. 常引用的特性

    const的本意,即不可修改,所以,const对象,只能声明为const引用,使其语义保持一致性

    non-const对象,既可以声明为const引用,也可以声明为非const引用,声明为const引用,则不可通过const引用修改数据。

    2. 临时对象的常引用(常见的几种类型如下)

    (1)临时对象,通常不可取地址的对象,如常量,表达式,函数返回值等

    如果这些引用之前不加const则会报错,non-const lvalue reference to type "int" cannot bind to temporary of type 'int',即,类型为“int”的非const左值引用不能绑定到'int'类型的临时值

    (2)类型不同的变量

    此时输出值为rd=1;

    但是若反向来

    输出ra仍为3;

    (3)其实在引用的过程中,产生了一个中间变量

    由于产生的中间变量t,使得t是d的别名,ra是t的别名,所以就算是d的值改变了,但是由于中间变量t的值没有变,因此最终的rd也是没有变化的。

    3. 引用的本质

    引用的本质:引用的本质是一个指针,必须初始化,是一个常指针,引用一经声明,不可改变int *const p

    4. new/new[]/delete/delete[]堆内存操作

    c语言提供了malloc和free两个系统函数,完成对堆内存的申请与释放,c++则提供了两个关键字new和delete,此两关键字是为类对象而设计的

    (1)new生成一维指针

    int *p = new int ;

    对于这个一维指针初始化的方法有两种,分别为

     

    (2)new[]生成一维指针

    在这里,new []中有两个参数,分别为float和10

    (3)new []生成指针数组

    (4)new []生成二维数组

    (5)new []生成两个矩阵,每个矩阵都是三行五列的

     

    (6)delete

    5. 对于C语言来说,当其在堆上申请了一个空间之后,我们会检查申请空间是否成功,在C++里面,成为返值输出

    有两种方法

    (1)  用try语句来捕获异常:如果内部空间发生错误,那么就应该加上一段语句来捕获异常

    (2)  用set_new_handler,即发生异常的时候再返回去调用

    6. new和delete使用注意事项

    (1)  new/delete是关键字,效率高于malloc和free

    (2)  配对使用,避免内存泄漏和多重释放

    (3)  避免交叉使用,比如malloc申请的空间去delete, new出的空间被free

    7. 宏函数的优点,内嵌,避免函数调用的开销,替换次数多了会导致代码膨胀

    普通函数的优点:抽象,可以实现一次书写n次调用,没有替换,也不会导致代码膨胀

    宏函数

    普通函数

    优点

    内嵌代码,避免压栈与出栈的开销

    高度抽象,避免重复开发,类型检查

    缺点

    代码替换,易使生成的代码体积变大,易产生逻辑错误,无类型检查

    压栈与出栈带来开销

    鉴于宏函数和普通函数的优点和缺点,引入inline 函数,有类型检查,实现内嵌,其很像之前使用的register关键字,属于建议型关键字,短小而频繁使用的函数才有可能被编译器采纳为真正的inline函数

    inline优点:避免调用时的额外开销(入栈与楚栈)

    缺点:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间

    本质:以牺牲代码段空间为代价,提高程序的运行时间的效率

    适用场景:函数体很小并且被频繁调用

    8. cast类型强转

    C style

    C++ style

    (type)expression

    xxx_cast<type>(expression)

    C++提供了四种转换:static_cast, reinterpret_cast, dynamic_cast和const_cast

    (1)  static_cast(用于双隐和单隐两种情况)

    在一个方向上可以隐式转换,在另一个方向上,可以显式地静态转换

    语法格式

    Static_cast<type>(expression)

    适用场景

    在一个方向上可以做隐式转换,在另一个方向上就可以做静态转换

    任意类型的可以赋给void *,但是void不能赋给任意类型

     

    (2)  reinterpret_cast(用于双不隐的情况)

     

    (3)  const_cast(去const化,去的指针和引用的const化)

     

    const_cast只作用于指针和引用,去const化,可以将其理解为const sematic的补充

    非const对象àconst 引用/指针à去cosntà原非const对象修改

    const对象可不可以去const化à这种行为会导致未定义

     

    9. namespace命名空间

    命名空间为了大型项目开发,而引入的一种避免命名冲突的一种机制,比如,在一个大型项目中,要用到多家软件开发商提供的类库。在事先没有约定的情况下,两套类库可能存在同名的函数或是全局变量而产生冲突,项目越大,用到的类库越多,开发人员越多,这种冲突就会越明显

    (1)  在C语言之中,如果局部变量和全局变量均进行了定义,那么想要输出全局变量的值就很困难

     

    这里无论怎么样都输出的都是局部变量,不会再输出全局变量。针对这种情况,C++提出了一种命名空间的方法

     

    结论:C++中的命名空间,就是将无名全局命名空间再次划分,确切的说,是对全局的函数和变量再次进行作用域打包,using是释放命名空间的过程

    (2)  命名空间的声明与使用

     

    (3)  命名空间是可以嵌套的

     

    (4)  协作命名空间

    • 同名命名空间自动合并(为协作提供了很大的方便

    10. 字符串

    (1)输入输出

    (2)  定义

     

    (3)  string类型的求长度

     

    (4)  初始化

     

    (5)  字符串的求长,拼接,比较和拷贝

     

    string重载了运算符+  -  < >  =  !=  +=使字符串操作变得非常简单,其运算方式类似于普通数值运算,这是运算符重载的好处

    (6)  字符数组

    (7)  string是支持下标的,

     

  • 相关阅读:
    python 学习笔记 数值型(1)
    python 学习笔记 标识符和变量(3)
    python 学习笔记 字符串(2)
    jsp+servlet+javaBean+Dao
    面试被问到岗时间,是越快越好吗?
    有赞多平台推广接入与测试
    HTTPS 加密、证书、签名与握手
    开发到底要不要自己做测试?
    我也曾找不到工作
    世界第三大浏览器正在消亡
  • 原文地址:https://www.cnblogs.com/Cucucudeblog/p/10043068.html
Copyright © 2011-2022 走看看