• C++拾忆


    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 为偏移一个元素

  • 相关阅读:
    java使用google开源工具实现图片压缩
    MyBatis实现Mysql数据库分库分表操作和总结
    简单记录你博客园的访问人数
    细说spring事务配置属性
    hazelcast初探
    jstorm之于storm
    如何让其他机器访问你的oracle数据库
    问题解决:bash: fork: retry: Resource temporarily unavailable
    分布式锁的几种实现方式
    建立索引的原则总结
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/10856617.html
Copyright © 2020-2023  润新知