c/c++学习杂记1

        本文主要用于笔者c/c++学习记录,水平有限,不对之处还望见谅,如果可以指正不胜感激。

1、STL分类

 2、template<typename T,int N>

模板只有在调用之时才会创建

3、栈是大小固定且默认的区域,堆是大小随着使用动态更改的区域

4、c/c++内存区域划分

5、回调函数(callback):可以在函数参数中调用函数指针作为函数参数使用;

6、Lambda表达式一般形式:[](int a){func;};

7、不轻易使用using namespace 的一些原因:

        a、可以很清晰的看出你所使用的东西来自哪个名称空间;

        b、可以区分不同空间里的同名函数

        c、不要在头文件中使用using namespace,头文件容易被引用造成名称空间滥用

        d、名称空间的使用主要是为了避免命名冲突,名称空间可以嵌套

8、Union 联合(特殊的类)

        联合与结构的区别在于:结构体中各成员有其各自的内存空间,结构体变量的长度为其各成员之和,但是联合变量的长度等于各成员之中最长成员的长度,即各成员共用一段内存;

        此处的共用是指联合变量可被赋予任一成员的值,但是每次只能赋给一个成员值,新值冲去旧值;

        联合成员不可进行初始化赋值,联合内部不可使用静态引用及类

        联合可以嵌套结构体

9、构造函数及析构函数

        只要基类析构函数是虚函数,那么派生类构造函数不论是否使用virtua声明,都将自动声明为虚析构函数。另外,析构函数可以为虚函数,构造函数不可为虚。构造函数声明为虚是为了防止内存泄露,在调用父类析构函数的时候自动调用子类析构函数。

        构造函数不可为虚的部分原因:

        主要原因:

       a、先从虚函数的作用来说,虚函数用于通过父类指针或者引用,在调用它本身那个函数的同时,可以完成对其子类相应函数的调用(如析构函数),但是构造函数是在创建对象时自动调用的,不存在一个“爷类”构造函数来调用它本身的构造函数;

        次要原因:

        b、创建一个对象需要确切知道其类型,但是虚函数是在运行时确定类型的,在构造一个对象时,由于对象还未创建成功,编译器是无法知道对象实际类型的;

        c、vptr(虚表)存储在对象空间之中,对象还未创建,没有vptr可供调用。

  10、c++数据类型转换

        a、static_cast: 主要用于:基本类型转换(int 转char);类的上行转换(子类指针或引用转换为基类(安全));类的下行转换(不安全);

        b、dynamic_cast:主要用于类的指针或者引用的转换。

        类的上行转换 (安全);类的下行转换(在有虚析构函数定义的情况下安全,同时RTTI需要打开)

        c、const_cast:用于改变变量的常量属性;

        d、reinterpret_cast:用于非关联类型转换,用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作。

11、多线程分类:a、基于进程的多任务是程序的并发执行;b、基于程序的多任务处理是同一程序片段的并发执行。

12、c++引用与指针的区别与联系

       a、指针可为空,引用不行

        int *p = NULL;  可以

        int  &p = NULL; 不行

       b、指针可以为通用指针,引用不行

        int *p ;可以 

        int &p;  不行

        c、编译器会为指针单独分配内存空间,但是不会为引用分配,引用相当于变量的别名(存疑,只是说可以这样理解),无实体,一旦初始化引用,后续便不可更改所指对象,所有对引用的操作都是对原始数据的操作。

13、c++类所占的内存大小以及成员函数的存储位置

        类所占内存的大小是由成员变量(静态成员变量除外)决定的,虚函数指针和虚基类指针也属于数据部分,成员函数是不计算在内的,因为在编译处理后,成员变量和成员函数是分离的。

        综上所述,同一个类创建多个对象时,其数据成员是各用各的,互不相通(静态成员变量共享),成员函数是共享的,多个对象共用一份代码。所有类成员函数和非成员函数代码都存放在代码区。无论成员函数的定义在类中还是类外,成员函数都存储在代码区。

14、如果类中存在const或者引用的成员变量,则在编译时默认构造函数被禁止使用。

15、使对象只产生于堆的方法:要对象产生于堆,则只需要使用new(动态分配),而只产生于堆则需要禁止A  a(静态分配);所以将析构函数声明为private或者protected即可。

       使对象只产生于栈的方法:将operator new 以及 operator delete 声明为私有的。

16、volatile 的使用方法:volatile定义是为了提醒编译器后面所定义的变量随时可能改变,因此每次存储或读取该变量时不对该变量进行优化,直接从内存地址中读取,从而实现对某个地址的稳定访问。

        a、中断服务程序中修改的供其他程序检测的变量需加volatile;

        b、多任务环境下各任务共享的标志;

        c、存储器映射的硬件寄存器(如状态寄存器)

小白学习记录,个人理解,不对之处见谅(55555555~~~~~~~~~~~~~)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值