首页 > 代码库 > C++ class

C++ class

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

一点一点来: 技术分享

一 , 创建class

#include <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
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;
}

结果:

技术分享

本文出自 “Better_Power_Wisdom” 博客,请务必保留此出处http://aonaufly.blog.51cto.com/3554853/1920946

C++ class