关闭

C++之类(class)的定义与实现

标签: C++class原理
175人阅读 评论(0) 收藏 举报
分类:

一、类的定义

   C++中使用关键字 class 来定义类, 其基本形式如下:

class 类名
    {
        public:
            //公共的行为或属性

        private:
            //公共的行为或属性
    };
        说明:
        ①. 类名 需要遵循一般的命名规则;
        ②. public 与 private 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。
            一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;    
        ③. 结束部分的分号不能省略。

      实例类代码部分:

      例子以设置和打印坐标点为依据

class Point
            {
                public:
                    void setPoint(int x, int y);//成员函数
                    void printPoint();

                private:
                    int xPos;//数据成员
                    int yPos;
            };
    代码说明:
        上段代码中定义了一个名为 Point 的类, 具有两个私密属性, int型的xPos和yPos, 分别用来表示x点和y点。在方法上, setPoint 用来设置属性, 也就是 xPos 和 yPos 的值; printPoint 用来输出点的信息。
        
        类在定义时有以下几点需要注意:
            ①. 类的数据成员中不能使用 auto、extern和register等进行修饰, 也不能在定义时进行初始化, 如int xPos = 0; //错;
            ②. 类定义时 private 和 public 关键词出现的顺序和次数可以是任意的;
            ③. 结束时的分号不能省略, 切记!

二、C++类的实现

     上面的定义示例中我们只是定义了这个类的一些属性和方法声明,并没有去实现它, 类的实现就是完成其方法的过程。

     类的实现有两种方式, 一种是在类定义时完成对成员函数的定义, 另一种是在类定义的外部进行完成。

1、在类定义时定义成员函数

#include <iostream>

 using namespace std;

        class Point
        {
            public:
                void setPoint(int x, int y) //实现setPoint函数
                {
                    xPos = x;
                    yPos = y;
                }

                void printPoint()       //实现printPoint函数
                {
                    cout<< "x = " << xPos << endl;
                    cout<< "y = " << yPos << endl;
                }

            private:
                int xPos;
                int yPos;
        };

        int main()
        {
            Point M;        //用定义好的类创建一个对象 点M
            M.setPoint(10, 20); //设置 M点 的x,y值
            M.printPoint();     //输出 M点 的信息

            return 0;
        }

2、在类外定义成员函数

    在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:

 返回类型 类名::成员函数名(参数列表)
        {
            //函数体
        }

    将上面类定义时的代码改成类外定义成员函数

#include <iostream>

        using namespace std;

        class Point
        {
            public:
                void setPoint(int x, int y); //在类内对成员函数进行声明
                void printPoint();

            private:
                int xPos;
                int yPos;
        };

        void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
        {
            xPos = x;
            yPos = y;
        }

        void Point::printPoint()       //实现printPoint函数
        {
            cout<< "x = " << xPos << endl;
            cout<< "y = " << yPos << endl;
        }

        int main()
        {
            Point M;        //用定义好的类创建一个对象 点M
            M.setPoint(10, 20); //设置 M点 的x,y值
            M.printPoint();     //输出 M点 的信息

            return 0;
        }

  依 setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式,其返回类型、成员函数名、参数列表都要与类内声明的形式一致。

三、C++类的使用

类对象的创建:

   将一个类定义并实现后, 就可以用该类来创建对象了, 创建的过程如同 int、char 等基本数据类型声明一个变量一样简单, 例如我们有一个Point类, 要创建一个Point的对象只需要:

Point 对象名;

   创建一个类的对象称为该类的实例化, 在创建时我们还可以对对象的属性进行相关的初始化, 这样在创建完成后该对象就已经具有了一定得属性, 这种创建方式将在下一篇博文中进行学习。
  将类进行实例化后系统才会根据该对象的实际需要分配一定的存储空间。这样就可以使用该对象来访问或调用该对象所能提供的属性或方法了。

         仍以上面的代码为例子,我们 创建类W;并把Point类的实现放在头文件Point.h中;


头文件Point.h:

#include<iostream>
using namespace std;
class Point
{
public:
	void setPoint(int x, int y); //在类内对成员函数进行声明
	void printPoint();

private:
	int xPos;
	int yPos;
};

void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
{
	xPos = x;
	yPos = y;
}

void Point::printPoint()       //实现printPoint函数
{
	cout << "x = " << xPos << endl;
	cout << "y = " << yPos << endl;
}


main函数:

#include <iostream>
#include "Point.h"

using namespace std;

int main()
{
	Point F;        //用定义好的类创建一个对象 点M
	F.setPoint(11, 20);         //设置 M点 的x,y值
	F.printPoint();             //输出 M点 的信息
	//cout << M.xPos << endl;       //尝试通过对象M访问属性xPos

	return 0;
}

结果:


    代码在编译时会出现错误, 提示 error: 'int Point::xPos' is private, 这是 cout<< M.xPos <<endl; 这行造成的, 他试图访问一个 private 对象中的私密数据 xPos, 如果将这行去掉便可正常运行。

    

    通过 对象名.公有函数名(参数列表); 的形式就可以调用该类对象所具有的方法, 通过 对象名.公有数据成员; 的形式可以访问对象中的数据成员。

四、类对象成员介绍

#include <iostream>
using namespace std;

class Point
{
public:
	Point(int x = 0, int y = 0) :xpos(x), ypos(y)
	{
		cout << "函数开始调用A"<<endl;
	}
	void printA()
	{ 
		cout << "调用A" << endl;
		cout << "(" << xpos <<","<< ypos << ")" << endl;
	}
private:
	int xpos;
	int ypos;
};
class B
{
public:
	B(int x, int y, int x1, int y1) :M(x, y), N(x1,y1){ cout << "函数开始调用B"<<endl; }
	void printB()
	{ 
		cout << "调用B" << endl;
		M.printA(); 
		N.printA();
	}
private:
	Point M;
	Point N;
};

int main()
{
	Point A(100);
	A.printA();
	cout << "//////////" << endl;
	B C(1, 2, 3, 4);
	C.printB();

	return 0;
}
结果:


代码说明:
     通过初始化表达式对象 A 中的 M、N 数据成员的初始化顺序如下: 首先 M 对象的构造函数被调用, 接着调用 N 对象的构造函数, 最后 B类的构造函数被调用, 这样便完成了类对象成员的初始化。

五、资料参考

The use of class about C++

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:75674次
    • 积分:1496
    • 等级:
    • 排名:千里之外
    • 原创:83篇
    • 转载:11篇
    • 译文:0篇
    • 评论:3条
    最新评论