C++难点易错点解析(详细)

1、双向链表的初始化

srand((unsigned int)time(NULL));
    Double_Linklist mylist(10);
    Node *head = new Node;
    Node *p = NULL;
    Node *p1 = NULL;

    for (int i = 1; i <= 10; i++)
    {
        int a = rand() % 10;
        if (i == 1)
        {
            head->Key = i;
            head->Value = a;
            head->next = NULL;
            p1 = head;
        }
        else
        {
            p = new Node;
            p->Key = i;
            p->Value = a;
            p->next = NULL;
            p1->next = p;
            p1 = p;//下次进入循环时,就是p自身的next=new出来的新节点,等效出来就是续链子
        }
    }
    mylist.print_list(head);

delete p;

注意事项:①头节点唯一,且只能被复制,不能二次赋值

                  ②后续节点要与头节点关联,而且还要保证一个接一个不能断

                  ③p所需的node空间必须随用随创建

出现无限打印的错误原因:1.先添加节点,再设置头节点

2、指针

//指针p里保存的是数据的地址
    //指针定义;
    int a = 10;
    int *p = &a;
    cout << "a的地址 = " << &a << endl;
    cout << "指针p = " << p << endl;
    //指针的使用  通过指针间接的访问或者修改内存的内容,
    //p指向内存的地址,*p指向内存的内容
    *p = 1;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
//指针所占内存空间
    //32位操作系统,占4个字节;64位操作系统,占8个字节,
    //且只和操作系统位数有关,不与数据类型有关
    cout << "指针所占内存空间 = " << sizeof(int *) << endl;
//空指针:指针变量指向内存中编号为0的空间
    //空指针用于给指针变量进行初始化
    int *p1 = NULL;
    /*但空指针是不可以进行访问的
    内存编号为0-255为系统占用内存,不允许用户访问
野指针
    
    野指针是指指针变量指向非法的内存空间,即没有事先申请内存空间,却直接访问这个内存空间
    
    因此空指针与野指针都不可以使用/访问
    */
/*const修饰指针--常量指针
    const int *p=&a;常量指针
    特点:指针指向即指针所指内存地址可以修改
          但是指针指向的值即内存所存数据不可以被修改
          *p=20;❌
          p=&b; ✔
const修饰常量--指针常量
    int * const p =&a;指针常量
    特点:指针指向即指针所指内存地址不可以修改
          但是指针指向的值即内存所存数据可以被修改
          *p=20;✔
          p=&b; ❌
const修饰指针和常量
    const int * const p=&a;
        指针指向即指针所指内存地址不可以修改
        指针指向的值即内存所存数据不可以修改
        *p=20; ❌
         p=&b; ❌

3、结构体做函数参数

void print_hero(struct Hero heroArray[], int len);

void swap(int &a, int &b)引用传递,异或交换
{
    a ^= b;
    b ^= a;
    a ^= b;
}

void Weather_cast(string w="Sunny")//实时显示时间
{
    time_t t = time(0);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y/%m/%d   %X \n%A", localtime(&t));
    cout << tmp << "today is weather" << w << endl;
}

int(*p)[4] = new int[3][4]{ {0} };

4、继承中的多态

静态多态(编译阶段绑定地址):函数重载及运算符重载

动态多态(运行阶段绑定地址):派生类与虚函数

1.父类中有虚函数(virtual),

2.子类重写父类中的虚函数,

3.父类中的指针或引用指向子类中的对象。

本质:

父类中加入virtual关键字后,使得父类内部结构发生变化,生成一个虚函数指针,并同时指向一个虚函数表,表里记录着虚函数的入口地址,而父类指针接收子类对象时,调用的重写函数会指向子类对应的虚函数表,从而调用子类函数的入口地址

如果类中包含一个纯虚函数,就无法实例化对象,称为抽象类 virtual void test()=0;

抽象类的子类必须要重写父类中的纯虚函数,否则也属于抽象类

如果子类中具有指向堆区的属性,需要在父类析构函数加virtual,即虚析构,来调用子类析构函数

纯虚析构:声明与实现都要有类内声明,类外实现

多态即向上类型转换,安全

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值