zoukankan      html  css  js  c++  java
  • 类与模板注意事项

    C++是面向对象的,对象由类生成那么生成的对象应该注意些什么呢?类是怎么去生成对象的呢?类既然是个自定义的类型,那么类的内存是怎么样的呢?关于类去生成对象的各种需要去了解的点在下面都将会被提到;

    类的实例化:开辟内存并初始化

    封装

    public

    protected

    private

    把类的属性和函数实现封装起来;
    对象是怎么去访问其成员的呢?就和结构体去访问其成员一样,需要靠对象(变量)去访问其成员;

    this指针  student *const this;(this是对象内存空间的地址,依赖对象);

    _this_call调用约定;
    1.构造函数:student(){};

    初始化内存空间(可以重载)不依赖对象调用,不能手动调用;

    2.析构函数:~student(){}

    释放资源,释放内存(不可以重载)依赖对象调用,可以手动调用但系统还会调用析构函数(退化为普通函数的调用)你不可以决定自己的出生,但你可以决定自己的死亡

    3.拷贝构造函数:student(const & stu){}

    用一个已存在的对象去生成一个新的同类型的对象,实参付给形参是初始化的过程,所以参数类型要用引用,防止递归调用生成形参对象,最终造成栈溢出;

    深拷贝:申请新资源,赋值

    4.赋值运算符的重载函数:student & operator=(const & stu){}

    用一个存在的对象给一个已存在的对象赋值;需要进行自赋值的判断  
    (&可以去掉,为了调高函数的运行效率)
    深拷贝:自赋值的判断,释放旧资源,开辟新资源,赋值
    实现安全的深拷贝:临时对象来保存旧的对象

    写实拷贝的实现:

    其他两个默认函数:
    取地址操作符的重载函数:
    const修饰的取地址操作符的重载函数:
    对象的生存周期:
    临时量
    1.内置类型:常量
    2.自定义类型:变量
    优化:如果生成临时对象的目的是为了生成一个新的对象,那么会以生成临时对象的方式生成新对象。(隐式生成临时对象)
    隐式生成的临时对象是常量
    逗号表达式     0v0
    引用提升了临时对象的生存周期;
    不建议用指针指向临时对象;临时对象在表达式结束销毁
    const int &a=10;//true

    static修饰成员变量不属于对象,属于类作用域;一定要在类外初始化;
    static修饰的成员方法:cd_call调用约定,无this指针,不依赖对象调用;不可以访问成员变量,和成员方法,
    只能访问静态成员变量和静态成员方法;


    模板 c++泛型
    1.函数模板template<T T>
    函数模板(定义点)
    模板的实例化(调用点:用具体的类型来替换虚假的类型)
    模板函数(最后形成的调用函数)
    模板的编译:
    定义点:模板的头部;判断是否是模板函数
    调用点:模板函数,编译模板函数内容(若没有传入模板参数的类型,模板的实例化系统会自行推演)
    1.有实参系统才会推演 2.实参与形参不能产生二异性
    模板类型参数列表
    1.类型参数, typename | class
    2.非类型参数, int SIZE; 当做常量处理(float类型不能做非类型参数)
    模板的特例化:如:compare(char* a,char *b){return a>b;}
    ==>compare(char* a,char* b){strcmp(a,b);}
    调用的优先级: 特例化版本 > 模板版本
    模板需要精确匹配;
    类模板:
    函数的选择性实例化:不调用只会编译头部
    typename:告诉编译器后面跟的是一个类型;声明一个类型; 在模板参数列表中与class一样 template<typename T>==template<class T>
    auto:接受不明确类型;(模板中使用)
    运算符重载:为了满足自定义类型和内置函数一样的逻辑关系;
    void operator+(){}
    不能改变运算符的优先级;
    满足和系统提供的相同逻辑;
    不能创造新的运算符;例如:operator +-(){}
    内存池:
    new;delete;
    状态的切换;频繁的new和delete效率差;容易产生内存碎片(外碎片);(内碎片:结构体对齐);
    实现了内存的自我分配和释放;资源可以循环利用;
    内存池的实现:静态链表;函数重载(operator new,delete);内存池;单例模式;

    下一章有C++的写实拷贝和内存池的简单实现代码;

  • 相关阅读:
    E
    牛客比赛—身体训练
    前缀和例题
    欧拉函数模板
    3.30训练题
    poj1321棋盘问题
    记set学习
    B. K-th Beautiful String
    codeforces1293C
    LightOJ 1370 Bi-shoe and Phi-shoe
  • 原文地址:https://www.cnblogs.com/xcb-1024day/p/11283014.html
Copyright © 2011-2022 走看看