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

1. 常引用

常引用(const semantic),const定义的变量成为常变量,常量的形式,常量的作用,用作常量。常用作取代#define宏常量,声明为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++中的命名空间,就是将无名全局命名空间再次划分,确切的说,是对全局的函数和变量再次进行作用域打包

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

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

(4)  协作命名空间

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

10. 字符串

(1)输入输出

(2)  定义

(3)  string类型的求长度

(4)  初始化

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

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

(6)  字符数组

(7)  string是支持下标的,

C++基础知识--DAY2的更多相关文章

  1. Python基础知识-day2

    格式化输出 %占位符,s字符串,d 数字, 表示%  用%% name = input("请输入姓名: ") age = input("请输入年龄: ") he ...

  2. shell基础知识DAY2

    1.管道符(|):把一个命令的输出,把输出的内容传递给管道符后面命令的输入.如:ls -l | grep "^[^d]".2.jobs作业控制,后台运行bg PID,前台运行fg ...

  3. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  4. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  5. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  6. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  7. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  8. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

随机推荐

  1. Graphics

    Image img = Image.FromFile("g1.jpg");//建立Image对象Graphics g = Graphics.FromImage(img);//创建G ...

  2. Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**

    之前一直都是使用hibernate4.2.21的我,有一天突然没有使用本地的jar包而是让IDEA自动下载最新版本的hibernate5.2.2之后,发现有几个经常使用的方法报错了. //创建配置对象 ...

  3. js 中常用的循环

    参考文章: 1.js几种数组遍历方式以及性能分析对比 2.javaScript遍历对象.数组总结 首先是数组中可以使用的 1.for 循环 for (let i = 0; i < xxx.len ...

  4. 【C/C++】C/C++中的数组是怎么实现的?

    几乎所有的语言都把数组作为一种固有的数据类型,数组也是我们最常用的数据结构之一.在语言底层,数组是如何实现的呢?本文以抽象数据类型的形式,定义.实现数组. 创建数组,理论上,我们可以使用创建任意维度的 ...

  5. Oracle查看表空间,创建表空间

    查看表空间: SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space FROM ...

  6. python列表解析式,字典解析式,集合解析式和生成器

    一.列表解析式(列表推倒式): 功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表. 1 lst = [1, 3, 5, 8, 10] 2 ll = [x+x for x in ls ...

  7. 用大O记号法测量算法的效率(Algorithm efficiency Asymptotic notation Big O notation)

    为什么要了解算法的效率? 一般来说,编程就是把各种已知的算法代入到自己的代码当中,以此来解决问题.因此,了解各种算法的效率对于我们选择一个合适的算法有很大帮助. 算法的效率由什么确定? 从算法分析的理 ...

  8. 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并

    题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 1 ...

  9. 运行os.fork()报AttributeError: module 'os' has no attribute 'fork'

    现象 报错代码 def handle(s, c, db): pid = os.fork() if pid == 0: s.close() do_child(c, db) sys.exit() else ...

  10. MT【300】余弦的三倍角公式

    2017清华大学THUSSAT附加学科测试数学(二测)$\cos^5\dfrac{\pi}{9}+\cos^5\dfrac{5\pi}{9}+\cos^5\dfrac{7\pi}{9}$ 的值为___ ...