为了账号安全,请及时绑定邮箱和手机立即绑定

趣味 C++ 进阶

难度初级
时长 8小时 0分
学习人数
综合评分9.60
10人评价 查看评价
10.0 内容实用
8.8 简洁易懂
10.0 逻辑清晰
  • 引用和指针用法的区别。

    查看全部
  • 引用和指针功能一样,引用必须要初始化,赋值nullptr。

    int &ra = a;

    引用只能指向一个地址,而指针可以变化自己的指向地址。

    查看全部
  • 纯虚函数只可以被继承。

    将父类的析构函数声明为虚函数,作用是用父类的指针删除一个派生类对象时,派生类对象的析构函数会被调用。例如:

    class Staff
    {
    public:
       std::string name;
       int age;

       virtual ~Staff()
       {

       }
    }

    class Coder : public Staff
    {
    public:
       std::string language;

       virtual ~Coder()
       {

       }
    };

    int main(int argc,char **argv)
    {
       Staff * s = new Coder();

       delete s;

       return 0;
    }

    此时如果析构函数不加 virtual,那么 delete 父类指针的时候,子类的析构就不会被调用,某些情况下会导致内存泄漏。

    查看全部
    0 采集 收起 来源:强者争霸

    2021-08-02

  • 纯虚函数只可以被继承。

    将父类的析构函数声明为虚函数,作用是用父类的指针删除一个派生类对象时,派生类对象的析构函数会被调用。例如:

    class Staff
    {
    public:
       std::string name;
       int age;

       virtual ~Staff()
       {

       }
    }

    class Coder : public Staff
    {
    public:
       std::string language;

       virtual ~Coder()
       {

       }
    };

    int main(int argc,char **argv)
    {
       Staff * s = new Coder();

       delete s;

       return 0;
    }

    此时如果析构函数不加 virtual,那么 delete 父类指针的时候,子类的析构就不会被调用,某些情况下会导致内存泄漏。

    查看全部
    0 采集 收起 来源:强者争霸

    2021-08-02

  • 给员工分部门:类的继承

    类,就像是对某一类事物的抽象模版,我们可以根据这个模版生产出具有相同属性的对象。例如,我们之前将员工抽象成了 Staff 类。

    而在某些场景下,我们希望对抽象的内容进行扩增,或者说更加具体化。例如,我们之前定义了员工,但是员工只是很抽象的一个概念,员工和员工是不一样的,例如,程序员和会计都是员工,他们都具有员工应有的属性,但是除此之外,他们还有额外属于自己的东西。

    为了完成这种关系,我们来学习一下继承。

    例如,我们可以来写一个程序员类,名字叫做 Coder

    class Coder { };

    这个 Coder 是员工的一种,他具有员工的所有属性,所以,我们可以让 Coder 继承自 Staff

    class Coder : public Staff { };

    当然,除了具有 Staff 的所有内容之外,Coder 还有属于自己的动作,那就是写代码,我们就可以这样写:

    class Coder : public Staff { public:     void code()     {         printf("Coding!!!\n");     } };

    这样,Coder 这个类,除了具有 Staff 的所有成员变量和成员函数之外,还有了一个属于自己的函数。

    查看全部

  • 类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。

    类的申明

    在 C++ 中,可以用下面的代码申明一个员工类:

    class Staff { };

    可以像使用结构体一样使用这个类:

    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }

    分文件编程

    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。

    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。

    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。

    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。

    实例化

    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。

    #include "Staff.h" 

    int main(int argc,char **argv) 

    {     // 我们就这样实例化了三个员工     

    Staff st1;     

    Staff st2;     

    Staff st3;    

    return 0; 

    }

    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。

    new delete

    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。

    #include "Staff.h" 

    int main(int argc,char **argv) {    

    Staff * st1 = new Staff();     

    Staff * st2 = new Staff();     

    Staff * st3 = new Staff();     

    // 记得释放    

     delete st1;     

    delete st2;     

    delete st3;     

    return 0;

     }


    查看全部
  • 霸道总裁的员工:类


    我们上一小节中介绍了面向对象的思想,这一小节开始,我们来具体看看在 C++ 中应该如何实现面向对象。



    类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。


    类的申明


    在 C++ 中,可以用下面的代码申明一个员工类:


    class Staff { };


    可以像使用结构体一样使用这个类:


    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }


    分文件编程


    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。


    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。


    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。


    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。


    实例化


    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。


    #include "Staff.h" 

    int main(int argc,char **argv) 

    {     // 我们就这样实例化了三个员工     

    Staff st1;     

    Staff st2;     

    Staff st3;    

    return 0; 

        

    }


    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。


    new delete


    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。


    #include "Staff.h" 


    int main(int argc,char **argv) {    


    Staff * st1 = new Staff();     


    Staff * st2 = new Staff();     


    Staff * st3 = new Staff();     


    // 记得释放    


     delete st1;     


    delete st2;     


    delete st3;     


    return 0;


     }


    查看全部
  • 霸道总裁的员工:类

    我们上一小节中介绍了面向对象的思想,这一小节开始,我们来具体看看在 C++ 中应该如何实现面向对象。

    类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。

    类的申明

    在 C++ 中,可以用下面的代码申明一个员工类:

    class Staff { };

    可以像使用结构体一样使用这个类:

    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }

    分文件编程

    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。

    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。

    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。

    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。

    实例化

    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff st1;     Staff st2;     Staff st3;     return 0; }

    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。

    new delete

    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。

    #include "Staff.h" 

    int main(int argc,char **argv) {    

    Staff * st1 = new Staff();     

    Staff * st2 = new Staff();     

    Staff * st3 = new Staff();     

    // 记得释放    

     delete st1;     

    delete st2;     

    delete st3;     

    return 0;

     }

    查看全部
  • 霸道总裁的员工:类

    我们上一小节中介绍了面向对象的思想,这一小节开始,我们来具体看看在 C++ 中应该如何实现面向对象。

    类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。

    类的申明

    在 C++ 中,可以用下面的代码申明一个员工类:

    class Staff { };

    可以像使用结构体一样使用这个类:

    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }

    分文件编程

    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。

    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。

    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。

    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。

    实例化

    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。这个过程就像是公司招聘员工一样,幸运的是,我们作为程序的老板,并不需要和现实中一样去张贴招聘启示。在 C++ 中,“招聘“员工,只需要用以下的代码就可以了。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff st1;     Staff st2;     Staff st3;     return 0; }

    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。

    new delete

    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff * st1 = new Staff();     Staff * st2 = new Staff();     Staff * st3 = new Staff();     // 记得释放     delete st1;     delete st2;     delete st3;     return 0; }

    查看全部
  • 霸道总裁的员工:类

    我们上一小节中介绍了面向对象的思想,这一小节开始,我们来具体看看在 C++ 中应该如何实现面向对象。

    类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。之后的学习中你会更加理解类。现在,我们只简单得来介绍一下类。

    类的申明

    在 C++ 中,可以用下面的代码申明一个员工类:

    class Staff { };

    可以像使用结构体一样使用这个类:

    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }

    分文件编程

    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。

    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。

    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。

    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。

    实例化

    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。这个过程就像是公司招聘员工一样,幸运的是,我们作为程序的老板,并不需要和现实中一样去张贴招聘启示。在 C++ 中,“招聘“员工,只需要用以下的代码就可以了。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff st1;     Staff st2;     Staff st3;     return 0; }

    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。

    new delete

    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff * st1 = new Staff();     Staff * st2 = new Staff();     Staff * st3 = new Staff();     // 记得释放     delete st1;     delete st2;     delete st3;     return 0; }

    查看全部
  • 霸道总裁的员工:类

    我们上一小节中介绍了面向对象的思想,这一小节开始,我们来具体看看在 C++ 中应该如何实现面向对象。

    类,是 C++ 实现面向对象最基础的部分。类其实和之前学过的结构体十分相似,你可以认为类是结构体的升级版。之后的学习中你会更加理解类。现在,我们只简单得来介绍一下类。

    类的申明

    在 C++ 中,可以用下面的代码申明一个员工类:

    class Staff { };

    可以像使用结构体一样使用这个类:

    #include <stdio.h> class Staff { }; int main(int argc,char **argv) {     Staff st;     return 0; }

    分文件编程

    我们在此之前都是把代码放到一个文件里,但是这样在实际工程中肯定是不行的,我们不可能把所有的代码都写到一个文件夹里面。而在 C++ 中我们就常常把类定义到不同的文件里面,把每个类都独立起来,这样代码的耦合性就会降低,方便维护。

    在 C++ 中,我们可以把一个类写到两个文件里面,一个是后缀为 .h 或者 .hpp 的头文件,一个是后缀为 .cpp 的实现文件。我们先在开发环境里新建一个类。输入类名是 Staff。

    可以看到 VS 为我们创建类两个文件,Staff.h 和 Staff.cpp。Staff.h 文件为定义,Staff.cpp 为实现。

    在分了文件之后,我们想要在 main 函数中引用这个类,就需要使用 #include “Staff.h” 将头文件引入进来。

    实例化

    在新建了一个类之后,我们就可以根据这个类产生对象了。根据类产生对象的过程叫做实例化。这个过程就像是公司招聘员工一样,幸运的是,我们作为程序的老板,并不需要和现实中一样去张贴招聘启示。在 C++ 中,“招聘“员工,只需要用以下的代码就可以了。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff st1;     Staff st2;     Staff st3;     return 0; }

    这样分配,我们将这三个“员工”分配到了栈上,同样的,可以把他们分配到堆内存上面去。

    new delete

    要将对象分配到堆上,需要用到另外两个关键字,new 和 delete。new 用来分配对象,delete 用来删除对象。new 会返回一个指针,在使用完毕后,要通过 delete 把这个指针指向的地址释放掉。

    #include "Staff.h" int main(int argc,char **argv) {     // 我们就这样实例化了三个员工     Staff * st1 = new Staff();     Staff * st2 = new Staff();     Staff * st3 = new Staff();     // 记得释放     delete st1;     delete st2;     delete st3;     return 0; }

    查看全部
  • 指针变量其实和普通变量没有什么区别,一个函数也是可以正常返回一个指针的。

    char * func()
    {
       char * p = nullptr;
       return p;
    }

    int main(int argc,char **argv)
    {
       return 0;
    }

    但是我们需要思考的是,什么情况下我们要返回一个指针,返回指针的时候需要我们注意些什么?

    通常情况下,我们是希望为函数外提供一片内存,例如,我们可以给函数外面提供一个数组。

    int * func()
    {
       int arr[] = {1, 2, 3, 4};
       return arr;
    }

    但是这样写得话,程序会崩溃掉。原因是,arr 数组是一个局部变量,在 func 结束之后,其内存就被销毁掉了。此时在函数外面对其进行操作,自然会出问题。所以,要完成这类操作,我们需要把内存分配到堆内存上面。

    int * func()
    {
       int * arr = (int *)malloc(4 * sizeof(int));
       return arr;
    }

    这样就没有问题了,当然,既然是分配在了堆内存上,就要记得手动销毁。

    int main(int argc,char **argv)
    {
       int * p = func();
       free(p);
       return 0;
    }

    查看全部
  • 代码块中定义的变量被称之为局部变量。它们在其他函数的语句中是不可见的,也无法访问它们。

    全局变量是在所有函数体的外部定义的,程序的所有部分都可以使用。全局变量不受作用域的影响,其生命周期一直到程序的结束。

    int a = 2;

    int main(int argc,char **argv)
    {
       return 0;
    }

    静态变量受作用域的影响,其生命周期一直到程序的结束。

    例如:

    void func()
    {
       static int a = 0;
    }

    我们可以在函数中申明一个静态变量。值得注意的是,这个变量的作用域虽然是在函数内,但是他并不会随着函数结束而被销毁,它会一直存在到程序的结束。

    查看全部
  • 指针可以指向一个数组,例如:

    #include <stdio.h>

    int main(int argc,char **argv)
    {
       int arr[] = {1, 2, 3, 4};
       int * p = arr;
       return 0;
    }

    比较特殊的是,数组名就是一个指针,不过数组名是一个常量指针,不能做累加或者累减操作。

    我们可以通过指针来访问数组元素:

    *(p + 2)

    同样,这句话等价于:

    p[2]

    查看全部
  • 指针可以指向一个变量,例如:

    #include <stdio.h>

    int main(int argc,char **argv)
    {
       int a = 0;
       int * p = &a;
       return 0;
    }

    如果想要通过指针操作变量,只需要使用解引用就可以了:

    *p = 20;

    查看全部

举报

0/150
提交
取消
课程须知
你需要具备基础的 C++ 语法知识,在学习本课程之前,建议先学习《趣味 C++ 入门》,快速认识 C++,熟悉 C++ 基本语法,更加快速入手进阶课程!
老师告诉你能学到什么?
在本门课程中,你将学习到:计算机存储数据的原理、指针的进阶、面向对象编程、内存管理技巧等 C++ 高级语法。在课程的最后,将带领大家使用 C++ 编写一个五子棋游戏,通过实践,加深理解,巩固学习成果。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!