21天学通C++--阅读笔记1

  • 源代码--编译-->目标文件--链接-->执行文件

     

     

    内存:

    RAMRandom Access Memory)随机存取器,运行程序时,程序从磁盘文件加载到RAM中,所有变量在RAM中生成,即内存。

     

    ASCIIAmerica Standard Code for Information Interchange)美国标准信息转换代码。

     

    typedef(给现有类型起别名)

    typedef 现有类型 别名

     

    变量溢出,注意变量类型的内存大小

     

    常量

    #define XXX xxx,文本替换,预处理器将XXX替换为xxx

    const int XXX = xxx,规定了常量的类型

     

    枚举

    enum XXX{xxx1, xxx2, xxx3};

     

    重载

    一个类中多个重名函数

     

    内嵌函数(inline

    编译器不创建真实函数,而是将内嵌函数的代码直接复制到调用函数中,不存在程序跳转。

    但当循环调用内嵌函数时,需多次将代码复制到调用函数中,影响程序性能。

    类方法内嵌:在声明类的头文件中定义方法的实现。

    应用:函数很小,切不会循环调用和多处调用的情况。

     

    函数调用

    调用函数时,其返回的地址和参数被放入堆栈,运行期间,局部变量也被放入堆栈,函数返回时,值从堆栈中被弹出删除。

    函数返回时,将值拷贝后返回;如果返回的为对象,则将对象进行复制构造后返回;如果返回的为指向对象的指针,则不再进行复制构造。

    int example(int x);

    调用时,x是实参的局部拷贝,所以函数执行完之后,x实参的值不会改变;

    int example(int *x);

    调用时,x指向实参的地址,即间接引用实参。这种定义方式暴露了函数的内部运作,使用者需显示传递变量的地址。

    int x = 10;

    example(&x);

    int example(int &x);

    调用时,x是实参的引用。这种定义方式使得用户不必关心函数的工作原理。

    int x = 10;

    example(x);

    XXX example(XXX x);

    这种定义方式当参数是空间比较大的对象时,会调用复制构造函数,增加内存空间占用,降低执行速度,执行完会调用析构函数,增加系统开销。

    过程:调用时,拷贝实参到x,执行完成后,析构x

    XXX &example(XXX &x);

    不对实参进行拷贝,但是破坏了数据的安全性(在函数内部可以对对象进行修改),解决:

    const XXX &example(const XXX & const x);

    --参数const表示,参数是const的指针,不能改变指针的指向,指针指向的对象也不能改变。

    XXX *example(XXX *x);

    不对实参进行拷贝,但是破坏了数据的安全性(在函数内部可以对对象进行修改),解决:

    const XXX *example(const XXX * const x);

     

     

    注:不要返回对不在作用域的对象的引用,返回在堆中的对象引用(函数体内new,返回*x

     

     

    指针&引用:

    引用:使得程序更清晰,易于使用,能很好的隐藏信息。引用不能被重新赋值,不能为空。

    指针:可被重新赋值,可为空。

    规则:尽量使用引用进行参数传递和返回,并采用const进行保护。

     

    类成员函数设计

    类成员数据私有,创建公有访问和设置私有成员变量的方法。

    将数据的存储细节与数据的使用分开。

     

    类的构造函数

    使用构造函数初始化对象。

    给出构造函数,则编译器不会提供默认构造函数。

     

    const常量(建议使用)

    类的const方法不会改变类的成员变量的值。

    void XXX() const;

     

    const int * pAge;

    //指向整型常量的指针,不能改变指向的值,若pAge是对象,则只能调用该对象的const方法

    int * const pAge;

    //指向整型的常量指针,不能改变指向的地址。

    const int * const pAge;

    //指向整形常量的常量指针,不能改变指向的地址以及地址内的值。

     

    类与结构体

    C语言有结构体,但该结构体没有类方法(函数),C++扩展C语言的结构体(有类方法),即类。

     

    指针

    是保存内存地址的变量。

    指针需初始化为NULL0,防止出现野指针。

     

    作用:处理自由存储区的数据;访问类的成员数据和函数;通过引用的方式向函数传递变量。

     

    int iAge = 10;

    int * pAge = &iAge;

    cout<<*pAge        //读取pAge地址处的变量值

     

    数据存储

    全局名字空间

    存储全局变量

    自由存储区

    堆,程序结束时才被清除。

    寄存器

    保存栈顶指针和指令指针等

    代码空间

    存储代码

    存储局部变量和函数形参,函数返回时自动清除数据。

     

    内存泄露

    原因:1.局部指针变量在函数返回时被丢弃(作用域为整个函数),而通过new分配的内存不会主动释放,不能被其他数据使用,造成内存泄露。2.未释放指针便对其重新赋值。

     

    解决:

    1. delete指针,释放指针指向的内存空间。多次delete会造成程序崩溃,所有释放完后,将指针置为空,因为delete空指针是安全的。2.new一次指针对应delete一次指针。

    int *pAge = new int;

    *pAge = 10;

    delete pAge;

    pAge = NULL;//防止出现野指针

    pAge = new int;

     

     

    引用

    引用不能被重新赋值,需初始化引用,引用不能为空(即引用的对象为空)

    int &rAge = age;

    //rAge作为age的别名,

    cout<<&rAge;

    //输出rAge的内存地址,同age的内存地址

     

    rAge = age2,则意味着age = age2,age,rAge,age2值相同,age,rAge的地址相同。

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值