• 从零开始的C++(六)


    1.类和对象补充:

    静态成员,有静态成员函数和静态成员变量,特点是不为类的某个对象所有,而是为同类所有对象共有。因为是为同类对象共同拥有,所以计算对象的大小的时忽略静态成员。因为静态成员是放在静态区,对象的作用只是确定类域,所以(类名*)0->静态成员名是可以访问的,不会引发报错。

    静态成员不能给缺省值,因为静态成员的初始化不是在初始化列表里进行,而是在类外进行。(假设是在初始化列表内进行,不就相当于一个对象对应一个静态成员了吗)同时,类内的只是声明,定义需要在类外(定义的时候需要写类名,且定义与声明必须分离)。

    静态成员函数:无this指针,因为不是特别对于某个对象。

    调用方式有三种:类名::函数名;对象名.函数名;类名().函数名;

    静态成员函数内只能有静态成员,不能有非静态成员(因为没有this指针,无法访问非静态的)。但是非静态成员函数内可以有静态、非静态的成员。

    利用构造函数、静态成员、定义数组可以实现一些简单的循环过程。(如从1加到n的求和等)

    2.友元:

    分为友元函数和友元类

    友元函数:无this指针(因为不是成员函数),因为没有this指针,所以无法将const写在形参和函数体之间。一个函数可以是多个类的友元函数。友元函数在类内的声明可以在类内任何位置,且不受类内的访问限制符(如public/private等)的影响。

    友元类:(注:很容易理解反!)  如果希望类A能访问类B的私有成员,则类A是类B的友元,类B内声明类A是友元。

    友元类是单向的,如类A是类B的友元,则类A可以访问类B私有成员,但类B不能访问类A的私有成员。同时,友元类也没有传递性,比如类C是类A的友元,类A是类B的友元,但类C不是类B的友元,即类C不能访问类B的私有成员。

    友元类很容易混,因此不建议多用!

    3.内部类:

    顾名思义,就是在一个类的声明内有另一个类的声明,此时“另一个类”就是内部类,而外部的就是外部类。

    此时求外部类的大小的时候忽略内部类,因为内部类和外部类本质上是两个相互独立的类。

    内部类的特点:1.受外部类的访问限定符和类域的影响。2.可以访问外部类的私有成员(内部类天生是外部类的友元)3.定义内部类的对象“外部类::内部类 +对象名。

    4.编译器的某些优化

    因为不同编译器、编译器版本的影响,优化的内容可能有所不同,此处主要说明一些比较常见的优化,了解即可。

    1.函数实参、形参之间是值传递的时候,调用的是拷贝构造。(如果不重写拷贝构造是浅拷贝、重写可能是深拷贝)

    2.匿名对象具有常性,如果引用一个匿名对象,则引用必须用const修饰。同时,匿名对象做函数实参,形参必须用const修饰。(在用const修饰以后,匿名对象的生命周期被延长,可以视为匿名对象转变成了有名对象(名字就是形参名或引用名))

    3.在例如函数返回值、对象初始化时如果出现连续的构造、拷贝构造,编译器可以优化成一步构造。(常出现与用隐式转换、匿名对象的场合)。

    4.函数返回值是一个对象时,是先把该对象用拷贝构造给一个临时对象,在用赋值的方式把临时对象赋给实际接收的对象。

    5.拷贝构造和赋值不能合并。

    5.内存管理:

    1.C++兼容c,因此malloc、calloc、realloc、free等依然可以使用。其中calloc=malloc+memset,realloc有原地扩容和异地扩容两种。

    2.C++特有的是new和delete.

    利用new创建:new+类型:会自动计算大小,且不用强制类型转换,对于内置类型不处理,对自定义类型会调用默认构造(能调用构造函数是其一大特点)。此时销毁delete 指针名。

    创建数组:new+类型(个数),此时销毁delete[]指针名。

    开辟空间同时初始化:new+类型[初始化的值]或new+类型{值1、值2、值3...}

    malloc和new的区别:malloc对于自定义类型不做处理,但new可以自动调自定义类型的构造函数,并且可以初始化。同时,delete也会自动调用析构函数并释放空间。

    一般的,初始化自定义类型常用匿名函数和隐式类型转换。

  • 相关阅读:
    7年阿里测试岗,我眼中的阿里虽然不完美,但值得去学5年
    Java之多态数组
    OpenAcc的使用
    C语言06、指针
    IWR6843 TI毫米波雷达介绍
    docker&kubernets篇(二十八)
    linux下doc转docx
    深度学习笔记(2)——pytorch实现MNIST数据集分类(FNN、CNN、RNN、LSTM、GRU)
    【CSS】解决对齐的小问题
    C#控制电脑注销、关机、重启
  • 原文地址:https://blog.csdn.net/yyssas/article/details/133636162