• C++学习-8


    1.注意:函数指针前面*,&都是一样的没啥实际意义,除了把实例化函数块的时候,需要指针或者引用修饰  

     cout << typeid(my1.show).name() << endl;

    cout << typeid(&my::show).name() << endl;

    直接调用成员函数和通过对象调用成员函数类型是不一样的

    void __cdecl(void)

    void (__thiscall my::*)(void)

    成员函数赋给函数指针,不能使通过对象函数传,必须得走类函数走法

    myclass my1; myclass*pmy = &my1;                         (my1.*p)();调用这个指针的时候,还是必须得通过对象走

    void(myclass::*p)(void) = &myclass::show;             (pmy->*p)();

    总结:绑定的时候使用类的性质,调用的时候是用的对象走

    2.类成员函数指针,包含了this指针,必须明确谁来调用

    int(myclass::*p[4])(int, int) { &myclass::add, &myclass::sub, &myclass::mul, &myclass::divv };//栈上的调用

    p = new (int(myclass::*[4])(int, int)){ &myclass::add, &myclass::sub, &myclass::mul, &myclass::divv };//堆上的调用

    (pclass->*p[i])(100, 10)  是一个整体

    int(myclass::**pp)(int,int)= int(myclass::*p[4])(int, int)

    **pp=*p[]   多的这个*就是指向由[]构成的数组的地址

    重点注意:数组的[]一定是跟在名字的后面

    3.数组原本是常量,当传参的时候才是数组才转换为指针,才能有所谓的++;

    4.类成员可以用=或{}进行赋值

             嵌套类初始化,是指针类就new()初始化,是类就直接调用初始化

             嵌套的子类要是共有的就可以通过外类::该类()

    5.委托构造函数:实现迭代式开发,参数的重重递增,功能的层层递加,

                                       从整体上看,多的参数是有少的参数的构造函数组合而成的,有点递归的感觉

    6.const的类对象,只能调用带const的方法,无法修改数据

    常量对象:必须初始化而且之后不可以修改,可以通过const_cast<>()进行强转,间接修改
    const这种成员初始化的时候,要么在成员声明那里直接赋值,要么就在构造函数初始化列表进行初始化

    Const不适用于构造和析构

    7.构造函数:有成员数据必须在里面初始化或者构造初始化,不搞没()

    8.就对象而言:const 类 *p   指向常量对象的指针

                                       类 *const p   指向变量的常量指针

    Mutable消除const属性

    9.拷贝构造:myclass(const myclass & my)可以任意加参数进行额外操作(也只是在new了数据成员才有)

    返回的副本机制,参数值传递,初始化拷贝构造

    10.注意打印地址的时候要(void *)转换一下

             要使用C语言的字符串函数加#include<cstring>

    一个类是描述性的,成员数据是描述该类属性的,那么构造参数传进来的是描述的对象一定是先进行拷贝,然后对对象进行解析,赋值成员。只要是跨区的操作,就别想着单纯的使用指针去对应,这样不安全也不稳定

    11.只要构造分配的是数组,那么析构就对应的指针进行delete[] p对应

    13.空字符在字符串中的处理:普通的定义不用去管多分配一个空字符(系统已经帮你),但是想strlen()这种返回的数量是不记录空字符的,那么在动态创建的时候就得+1

    14.你得记住,在传参是为了初始化一个类的属性指标的时候,要的绝对不是对原数据指针上的掌控,而是把这个数据完完整整的拷贝下来,然后再进行属性上的配对*************************************************************

    传的是你这个类需要的东西,你就必须深拷贝下来,原则

    跨区使用的数据基本要考虑是不是要把数据拷贝下来再进行处理,

    15. 其实深拷贝就再是初始化一次,只是参数必须是类对象

    注意:类的内部有指针分配内存,需要深拷贝,否则浅拷贝

    拷贝构造函数用于类对象之间的初始化的时候使用

    赋值运算符:类对象之间进行赋值的时候用到的

    拷贝和赋值时两个不同的阶段

    16.由构造函数触发的类型转换,类型转换是可以自定义的

    不同的类类型可以往不同的类类型进行转换(原理就是依据构造函数来的,只要你类的数据类型能够满足那个类的构造函数即可)

    本质:其实类之间的关系完全是依据成员数据产生的关系,

    不同的类类对象之间依据成员数据产生转换关系,因为对象这东西只有成员数据是独有的,成员函数代码块都是共享的

    相同类类之间是成员函数代码块是共享的。

    一个类所谓的初始化就是只要你能把他的数据成员都初始化,那么你就是可以往这个类上转换的类,毕竟成员函数在共享区

    17.类的声明提升作用域,指针或者引用适用,不能直接干对象(对象是需要你完全定义好了的)

    引用作为成员数据,只能默认初始化

    18.静态类成员数据不能默认初始化,用途:用于同类对象的通信

    静态变量的大小就不再类里面,在静态区

    19.静态函数无法使用this,创建静态函数的指针的时候也不需要myclass::

    类中的静态函数不需要依托对象才能调用,直接就是myclass::show();

    静态函数无法使用this,成员数据,成员函数

    用途:1.把一个类型的函数归类到一个功能类中,像引用一个命名空间就能调用它

    2.可以静态的数据和成员函数相互配合:数据负责存储对象的this*,然后传给静态函数进行类的相关操作

    3.直接静态成员函数单干,把this*当参数传进去

    (所有的这些,涉及到了类指针,自然独立性也会受到限制)

    静态函数配合静态变量(管理对象数量和批量操作)

    类的函数是可以调用静态的,所以可以用来在类函数中做标记,计数等等

    通过把类的对象指针当参数传进去

    对每个对象进行公操作,公纪录,公使用

  • 相关阅读:
    Jmeter csv文件进行参数化的两种方法
    Jmeter逻辑控制器: If控制器的解读
    Selenium问题集锦
    Jmeter BeanShell
    Jmeter进行接口流程测试
    服务器上部署Struts2的web项目报struts-default.xml:131:154的解决方法
    jmeter用Windows电脑分布式部署
    JMeter-一个接口的返回值作为输入传给其他接口:设置全局变量和非全局变量
    Flutter调研-Flutter基础知识、安装与demo
    MAC上安装maven以及配置Intellij IDEA
  • 原文地址:https://www.cnblogs.com/tony-xu999/p/8574017.html
Copyright © 2020-2023  润新知