Board logo

标题: 学习C++ -> 类(Classes)的定义与实现(2) [打印本页]

作者: yuyang911220    时间: 2017-4-21 20:44     标题: 学习C++ -> 类(Classes)的定义与实现(2)

  2>. 在类外定义成员函数
        在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:
        返回类型 类名::成员函数名(参数列表)        {            //函数体        }


        将示例中的代码改用类外定义成员函数的代码:

[url=][/url]
1         #include <iostream> 2 3         using namespace std; 4 5         class Point 6         { 7             public: 8                 void setPoint(int x, int y); //在类内对成员函数进行声明 9                 void printPoint();10 11             private:12                 int xPos;13                 int yPos;14         };15 16         void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数17         {18             xPos = x;19             yPos = y;20         }21 22         void Point::printPoint()       //实现printPoint函数23         {24             cout<< "x = " << xPos << endl;25             cout<< "y = " << yPos << endl;26         }27 28         int main()29         {30             Point M;        //用定义好的类创建一个对象 点M31             M.setPoint(10, 20); //设置 M点 的x,y值32             M.printPoint();     //输出 M点 的信息33 34             return 0;35         }[url=][/url]



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






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

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


    还以上面的代码为例, 为了减少篇幅, 我们把 Point 类的实现放在 Point.h 头文件中, 这里不再贴出 Point 类的实现代码。


[url=][/url]
1     #include <iostream> 2     #include "Point.h" 3 4     using namespace std; 5 6     int main() 7     { 8         Point M;        //用定义好的类创建一个对象 点M 9         M.setPoint(10, 20);         //设置 M点 的x,y值10         M.printPoint();             //输出 M点 的信息11         cout<< M.xPos <<endl;       //尝试通过对象M访问属性xPos12 13         return 0;14     }[url=][/url]


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


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






五、对象的作用域、可见域与生存周期
    类对象的作用域、可见域以及生存周期与普通变量的保持相同, 当对象生存周期结束时对象被自动撤销, 所占用的内存被回收, 需要注意的是, 如果对象的成员函数中有使用 new 或者 malloc 申请的动态内存程序不会对其进行释放, 需要我们手动进行清理, 否则会造成内存泄露。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0