1、引用

1、建立引用的时候,必须初始化,引用一旦初始化,就和一个对象绑定,不能再修改为其他对象的引用

2、对引用取地址,和对原始对象取地址,是同一个地址

3、不能用做引用的:void、数组

2、内联函数

1、内联函数不能包含复杂的结构控制语句,如switch和while。如果包含了,将被视为普通函数。

2、递归函数不能作为内联函数

3、内联VS宏  宏不检查类型,这个不一定是好还是坏。

3、函数重载

函数名相同,参数不同。(不以返回值区分)

用objdump可以看符号表,objdump -t main.o

以int foo(char,int)为例,

对于C语言来说,不支持重载,所以符号表直接用函数名表示,就是:foo

但对于C++来说,支持重载,所以符号表只用函数名表示是不行的,是:_Z3fooci,_Z3是返回值,参数是ci,c表示char,i表示int,具体咋看:https://blog.csdn.net/wdjjwb/article/details/86233389

所以,如果在C++里要引用C的函数,必须要加extern C,否则声明的是C++的符号类型。

4、函数模板&类模板

1、模板VS宏,模板可以做类型检查,这个不一定是好还是坏。

2、类模板函数的类外实现

template<class T1,class T2>

void A<T1,T2>::foo(T1 t1,T2 t2)

{}

3、类模板分文件编写的问题及解决方案:

问题:链接不到

解决:包含cpp(#include "xxx.cpp")  或者 写.hpp文件

5、类和对象

静态、全局对象会有固定默认值,其他值的默认值是随机的。

类前置声明后,只能使用类的指针和引用,而不能使用类的参数传递。

class A;

class B

{

  f(A* a)  //正确

  f1(A& a)  //正确

  f2(A a) //错误

}

6、动态内存分配

动态内存分配函数:

1、malloc/free ,是C的函数,所以也就不会构造/析构;是函数调用,不能重载

2、new/delete :是C++运算符,会调用构造/析构函数;是运算符,可以重载

3、new[]/delete[]:数组操作,也要配套使用

内存区域:

1、数据区:全局变量、静态数据、常量

1.1、全局变量:

  bss段:存放的是没有初始化或者初始化为0的全局变量

  data段:存放初始化为非零的全局对象。

对于一个全局对象,如果初始化为0或者没初始化,可执行文件占用大小很小,如果初始化为非0,可执行文件就会很大。

1.2、静态数据:

  全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。

1.3、常量

  rodata常量数据区

  rodata存放常量数据

  有些立即数直接和指令编码在一起,放在text中

  字符串常量,编译器会去掉重复的字符串,保证只有一个副本

  所以, char* s1 = "abcde";  char* s2 = "abcde";  //s1和s2的地址是一样的。

  但只有指针直接指向字符串的时候才会指向常量区的字符串,如果拷贝过,或者数组就不行

    但是数组不行 char a[] =  "abcde";  是把数据区的字符串拷贝到栈区的数组里了,a是数组首地址。

2、代码区:所有类的成员函数和非成员函数代码

3、栈区:为运行函数而分配的局部变量、函数参数、返回数据、返回地址等

4、堆区:动态内存分配区

7、拷贝构造函数

class A{  A(const & A);//拷贝构造函数  }

如果没声明,会默认提供一个,组个拷贝每个非static成员。

在传参和返回值时会隐式调用。

禁止拷贝构造函数的方法:private

8、const

const int *p;  // 指的是 *p 不能修改

int* const p; // 指的是p不能修改

推荐传递const引用,而不是传递对象,效率更高。

9、友元函数和友元类

友元关系不对称、不传递

A声明了B是友元,那么B久可以访问A的private和protect成员,B可以是方法或者类。

10、Valgrind内存检测/性能分析工具

11、重载运算符

不能重载的运算符:    ::   .*   .    ?:

可以使用友元函数或成员函数实现运算符重载,友元函数需要多一个参数,不需要加类作用域。

必须作为成员函数重载的运算符:     =   ()  []  ->

前增量重载  A& operator++()

后增量重载  A operator++(int)

12、多态

需要多态的函数需要声明为virtual

析构函数要申明为virtual

Java的所有方法都是virtual的

13、智能指针

SmartPtr是一个模板类

跟shared_ptr不一样。

14、设计模式

用策略模式替代菱形或其他复杂的继承

15、STL 标准模板库

字符串: stirng

容器:vector deque stack queue list map set

算法:

  <algorithm> 包括 :

      比较

      查找find find_if adjacent_find(查相邻重复的元素) binary_search(二分查找制定元素是否存在,返回bool,速度快,要求有序)

      统计count count_if

      搬运transform

      遍历for_each

      复制 copy

      替换 replace  replace_if swap(互换)

      排序 sort random_shuffle(洗牌,sort的逆操作)

      合并 merge

      反转 reverse

      集合函数:set_intersection 求交集,set_union 求并集,set_difference 求差集

      等等

  <numeric> 包括 几个在序列上进行简单数学运算的模板函数

      accuulate 求和

      fill 将指定区间的元素填充成指定值

  <functional> 定义了一些模板类,用以申明函数对象

15.1、deque

行为是一个双向数组

原理是一个多段数组

VS vector  优点:双向,插入块;缺点:访问慢

15.2、set vs multiset

multiset可以插入重复的值。

insert的返回结果是个pair,第一个是插入的迭代器位置,第二个是是否成功,如果是set插入重复的值,实际是插入失败的。

16、仿函数

重载了()操作符的函数

16.1、谓词

返回值为bool的仿函数

16.2、算数仿函数

操作的目的是计算的

16.3、关系仿函数

操作的目的是比较的

16.4、逻辑仿函数

操作的目的是逻辑操作的

17、多线程编程

18、数组内存大小

int a[] = {1,2,3,4,5,6};

sizeof(a)= 6*4;  //数组总大小

sizeof(a[0])=4;  //int的大小

int* p = &a;

sizeof(p)=4或8; //指针的大小

&a 和 a 都是指数组的首地址

但由于数据类型不一样,&a是数组,a是数组首元素。 &a + 1 为偏移整个数组,因为&a表示的是数组,+1指偏移数组的大小;  a+1 为偏移一个元素

C++拾忆的更多相关文章

  1. .Net拾忆:从List去除重复-拾忆集合

    方法1: private static List<int> DistinctList(List<int> list) {//去除重复 HashSet<int> ha ...

  2. Libero 使用拾忆

    使用Libero软件进行管脚分配的时候可以使用脚本语言,详细的使用说明见des_constraints_ug.pdf(在Libero安装目录下寻找) 如: set_io srame_oe -REGIS ...

  3. jquery实现的网页选项卡(拾忆)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Python拾忆--多线程的socket服务器

    阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~ 记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最 ...

  5. SQL SERVER 高级编程 - 自定义函数 拾忆

    每个人都很忙,但是花10分钟复习下,总结下基础东西还是很有益处的. 背景: 总结一句,使用简便,还能递归,是的SQL更简洁,相对比一大堆的关联语句,而且关联一大堆还不一定实现特定功能.而且共用部分可以 ...

  6. spring mvc DispatcherServlet详解之拾忆工具类utils

    DispatcherServlet的静态初始化 /** * Name of the class path resource (relative to the DispatcherServlet cla ...

  7. #ifdef,#else,#endif,#if 拾忆

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  8. Js拾忆

    instanceof运算符:他是判断一个构造函数的prototype是否在对象的原型链上查找到 var a = new Array(); console.log(a instanceof Array) ...

  9. .NET拾忆:反射的本质——元数据

    反射主要使用的命名空间: System.Reflection System.Type System.Reflection.Assembly 本质:元数据 反射的本质其实是使用元数据:元数据其实就是程序 ...

  10. .NET拾忆:FormData文件上传

    方法1.FormData简单实现 后端: using System; using System.Collections.Generic; using System.IO; using System.L ...

随机推荐

  1. 代码还原,IDA中使用的宏

    在IDA7.0中的定义文件拷贝的. 如果想使用,直接去IDA的plugins插件目录下.包含它的 **defs.h"" 如下: /* This file contains defi ...

  2. SpringMVC从Request域中获取数据

    SpringMVC从Request域中获取数据的三种方式 SpringMVC环境自行搭建, 约定存在如下目录和文件:/WEB-INF/pages/success.jsp 方式一:传入Model对象 前 ...

  3. GO标准库flag

    Go语言内置的flag包实现了命令行参数的解析. os.Args os.Args是一个[]string类型. 获取命令参数示例: func main() { if len(os.Args) > ...

  4. Azure存储简介

    注:此篇文档主要讲述微软azure全球版,并不完全试用azure中国区   azure存储是Microsoft一项托管服务,提供的云存储的可用性.安全性.持久性.可伸缩性和冗余都很高,azure存储包 ...

  5. arts打开第11周

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...

  6. requests库详解

    import requests #实例引入 # response = requests.get('http://www.baidu.com') # print(type(response)) # pr ...

  7. PHP用strtotime()函数比较两个时间的大小实例详解

    在PHP开发中,我们经常会对两个时间的大小进行判断,但是,在PHP中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...

  8. 【转】反编译获取任何微信小程序源码(完)

    一.前言最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了一个阿里妈妈淘宝客小程序的前端实现,过程一言难尽,差不多两周时间过去了,发现小程序的坑远比想象的要多的多!!在实际练手 ...

  9. C3线性化

    https://zh.wikipedia.org/wiki/C3线性化 在计算机科学中,C3算法主要用于确定多重继承时,子类应该继承哪一个父类的方法,即方法解析顺序(Method Resolution ...

  10. PHP 二维数组去重(保留各个键值的同时去除重复的项)

    对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...