热门IT资讯网

C++ class

发表于:2024-11-27 作者:热门IT资讯网编辑
编辑最后更新 2024年11月27日,C++的class和其他的高级语言如C#/Java有些不一样。这是C++面向对象的核心。一点一点来: 一 , 创建class#include using namespace std;class My_

C++的class和其他的高级语言如C#/Java有些不一样。这是C++面向对象的核心。

一点一点来:

一 , 创建class

#include using namespace std;class My_First_Class{    public:    int a;};int main(){    My_First_Class c;    c.a = 2;    cout << c.a << endl;    return 0;}

重点:

①:创建类 , 需要用关键字class。

②:class也是一种数据类型,{}外面需要以;来结束。


注意点:

①:int a 不能被初始化 , 原因:class没被初始化之前是没有空间分配的,当然其所有的成员也是没有空间的。

②:关于访问修饰符在C++中有3中 private , protected , public

1, 在class中默认为private , 在struct中默认为public

2, class中,访问修饰符可以有多个, 其作用范围为 : 其位置到下一个访问修饰符的位置(如果没有下一个访问修饰符则是到class结束位置既是 "}"),如下图:

③:My_First_Class c; 这种初始化是把My_First_Class类对象c放在了栈区。其实可以将其放入堆去,其方案是利用指针。代码如下:

#include using namespace std;class My_First_Class{    public:        int a;    private:        int c;};int main(){    //My_First_Class c;    //a = 2;    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    return 0;}

其结果如下图:

到目前我们会发现一个很基础的问题 , 成员的初始化(如果等待调用者自己一个一个用代码实现初始化的话 ,很有可能会漏掉),当然在C#/Java等高级语言中 , 这个就不成问题了。

在C++中,提供了构造函数可以提供初始化的

#include using namespace std;class My_First_Class{    public:        int a;    My_First_Class()    {        a = 1;    }    private:        int c;};int main(){    My_First_Class c;    cout << c.a << endl;    /*    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    */    return 0;}

注意:

①:构造函数和C#/Java一样 , name使用class的名称 , 而且没有返回值

②:构造函数默认应该放在public之下,不然会报错。

③:构造函数必须要在需要初始化成员的后面创建,如要初始化a(int) , 必须在int a;的后面创建。


初始化列表:

#include using namespace std;class My_First_Class{    public:        int a;    private:        int c;    public:    My_First_Class():a(1),c(2)    {    }};int main(){    My_First_Class c;    cout << c.a << endl;    /*    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    */    return 0;}

注意:

①:My_First_Class():a(1),c(2) 赋值的顺序是a , c的声明的顺序:

和在构造函数中:后面写的顺序无关:

如下面的写法,就不会得到预期的值:

#include using namespace std;class My_First_Class{    public:        int a;        int m;    My_First_Class():m(2),a(m)    {    }};int main(){    My_First_Class c;    cout << c.a << endl;    cout << c.m << endl;    /*    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    */    return 0;}

结果为:

因为赋值的顺序是先a后m(a在m前进行了声明)


当然 , 构造函数也可以是有参的和C#/Java一样 , 这里就不讲了


二:类内声明 , 类外定义

#include using namespace std;class My_First_Class{    public:        int a;        int m;    My_First_Class():m(2),a(1)    {    }    int sum();};int My_First_Class::sum(){    return a + m;}int main(){    My_First_Class c;    int sum = c.sum();    cout << c.a << endl;    cout << sum << endl;    /*    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    */    return 0;}

运行结果 :

当然 , 这种只是演示(实际开发中不这么搞) 。 实际开发中 , 将声明写在都文件中 , 将实现写在源文件中:

定义一个头文件:

实现:

#include using namespace std;#include "HeadOne.h"My_First_Class::My_First_Class(){    a = 10;}int main(){    My_First_Class c;    cout << c.a << endl;    /*    My_First_Class *c = new My_First_Class;    c->a = 3;    cout << c->a << endl;    delete c;    */    return 0;}

结果:


0