C++——类和对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Eleanor_12/article/details/54933125

1.类的声明

类是一种用户自定义类型,声明形式如下:

Class 类名称

{

Public

    公有成员(外部接口)

Private

    私有成员

Protected

    保护成员

};

 

2.公有、私有、保护成员

公有成员(public

公有成员是在public关键字的后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数

私有成员(private

私有成员在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问

保护成员(protected

保护成员在关键字protected后面声明,与private类似,其差别表现在在继承与派生时对派生类的影响不同

 

3.成员函数

成员函数即方法,既可以在类内进行实现,也可以在类外实现

如果在类内实现的话,编译器会默认将其的类型设置为inline类型即内联函数

 

下面用一个例子来理解一下:

首先写一个Student.h的文件,在里面对类进行声明。可以看到现在我是将a_这个变量定义在public下,所以是可以被公共访问的,而b_c_这两个变量是定义在private下的,所以只能在类内进行访问

 

接下来,写一个Student.cpp来对两个成员函数(方法)进行实现,这种方法即为在类外实现,功能分别为对a_ b_ c_三个变量进行赋值以及打印结果

 

最后,来进行main函数的编写,首先定义了Student的一个对象,调用初始化变量的函数,分别初始化为1,2,3,接着访问a_变量,如果最后输出的结果为4,2,3,说明成功的访问了a_变量,证明public中的变量是可以在类外访问的

 

我们来看一下结果:

 

最后的结果是4,2,3,说明a_能够在类外访问,成员函数也都成功执行了

 

4.class VS struct

Class数据成员默认是私有的

Struct数据成员默认是共有的,在C++中对struct也有所升级,不仅定义方法改变了,也可以跟类一样在其中定义方法(成员函数)

下面我们来验证一下:

 


 


5.this指针的作用

在了解this指针的作用前,我们先来看一下下面程序中的classstruct的大小分别为多少

我们对上面的代码进行些许修改

 

#include <iostream>

using namespace std;

class Test
{
    int a_;
    int b_;
    void displayA()
    {
        cout << "Display A!" << endl;
    }
};

struct Test1
{
    int c_;
    int d_;
    void displayB()
    {
        cout << "Display B!" << endl;
    }
};

int main()
{
    Test t1;
    Test1 t2;

    cout << "Size t1:" << sizeof(Test) << endl;
    cout << "Size t2:" << sizeof(Test1) << endl;

    return 0;
}

我们可以看到不管是class还是struct的大小都是8,说明classstruct的大小只与成员有关,而与成员函数(方法)无关。

这是因为class的空间中只储存了成员,而成员函数是储存在共享空间的,即所有的类都可以进行访问,那么计算机是怎么知道到底是哪一个类调用了这个函数呢,这时候就需要用到this指针了。

This指针保存的是调用这个方法的对象的地址,在对象调用方法的的时候会自动被传参给方法。

#include <iostream>

using namespace std;

class Test
{
public:
    int a_;
    int b_;
    void displayA()
    {
        cout << "Display A!" << endl;

	cout << "this->a = " << this->a_ << endl;
    }
};

struct Test1
{
    int c_;
    int d_;
    void displayB()
    {
        cout << "Display B!" << endl;
    }
};

int main()
{
    Test t1;
    Test1 t2;

    t1.a_ = 1;

    t1.displayA();

    return 0;
}


猜你喜欢

转载自blog.csdn.net/Eleanor_12/article/details/54933125