我在上一篇文章中已经对C++中类与对象开了一个小头,本章我们继续来探讨C++中关于类的一些知识点。
我在上一篇文章中提到了成员数据与成员函数,我们接下来讨论一下关于其中的一些细节。
正常而言,我们都会将成员数据放在private作用域下,将成员函数放在public作用域下,这时,我们可以通过成员函数对类内进行访问,所以成员函数就作为类的外部接口,例如下列代码:
class Person { public: void setname() { name = "张三"; } void showname() { cout << name << endl; } void setpassword() { password = "123456"; } void showpassword() { cout << password << endl; } private: string name; string password; };
我在这里定义了一个类,这个类的名字叫人类,这个类里面有两个成员属性,一个是姓名,一个是yhk密码,在public作用域下边有四个成员函数,分别用来设置(显示)姓名(yhk密码),虽然name和password都在private作用域下面,可是我依然可以通过类内的成员函数对它们进行赋值 *** 作和打印 *** 作,如果是在类外对private作用域下的成员进行访问,则是非法的。
看到这,有C语言经验的小伙伴可能看出来了,C++中的class和C中的struct(结构体)是十分类似的,那为什么C++还会保留结构体呢?这其实很大一部分是历史原因,C++为了保留对C的兼容,同时又为了支持面向对象编程,因此保留的struct,但是,class和struct还是有区别的,那就是他们的默认访问权限不同,class的默认访问权限是private,而sturct的默认访问权限是public,所以,我们在一些情况下使用struct,可以带来一定的便利,因为它的默认访问权限为public,这样我们就不需要在自己写一个成员函数对其内部进行访问的,但是由于struct终究还是面向过程的编程思想,因此我们在进行面向对象方法进行编程是,主要还是使用class。
我们可以看到上面的例子是将成员函数的实现写在类内的,这种方式在代码量极少的时候使用并无伤大雅,但是当代码量一大,这种方式就会让代码的可读性和结构变差,所以我这边教大家如何进行类内声明,类外定义的方法,这种方法也可以为日后的分文件编写提供便利,请看如下代码:
class Person { public: void setname(); //在类内声明函数 void showname(); void setpassword(); void showpassword(); private: string name; string password; };
void Person::setname() //在类外定义函数 { name = "张三"; } void Person::showname() { cout << name << endl; } void Person::setpassword() { password = "123456"; } void Person::showpassword() { cout << password << endl; }
这里就需要用到一个新的语法,当我们在类外定义函数时(前提是类内有函数声明)
语法:函数返回值类型 类名::函数名(形参列表){ }
然后我们在大括号里面进行函数的实现。
当我们进行大项目编程时,我们就要利用分文件编写,分文件编写就要利用类内声明,类外定义这样的方法,这样我们的代码结构性强并且可读性高。
以上是关于成员函数的浅谈,读者只需要在入门时先掌握这些就足够了。
关于成员数据:
我们知道,C++中有内置的基本数据类型,比如int,float,double等等,这些都是我们常见的,并且这些都是可以作为类中的成员数据的,但是,并不止只有这些可以作为成员数据,别的类的对象也以作为本类成员数据使用,通常我们是将两个相关性高的两个类进行这样的 *** 作,例如:点类与圆类,我们知道,类包含着对象的属性,那我们现在想想,圆类有哪些属性呢?
不难发现,圆具有的属性有半径和圆心,而圆心是一个点,也就是说点类的一个对象可以作为圆类中一个成员,代码实现如下:
class Point; class Circle { public: void setR(int r); int getR(); void setCenter(Point center); Point getCenter(); private: int m_R; Point m_Center; };
我在这里定义了一个圆类,可以看到圆类中包含着点类中的一个对象(圆心),在这里,可能有细心的读者发现了我在代码中并没有定义点类,而是用了“前向引用声明”这项技术,也就是先告诉编译器,我们有这样一个类,只不过还没有定义,这样编译器就不会报错,读者可以自行尝试一下如果将第一行的代码删去将会发生什么,当我们有一个类中用到了别的类中的对象,有两种方法,一是将别的类(本例中的点类)的定义放在前面,二就是利用“前向引用声明”这个技术,这个很简单,很好理解。
下面有道例题,读者可以自行去尝试一下,用到的就是上文所讲的点类与圆类,题目额如下:
利用点类与圆类,判断点和圆的位置关系。
答案会在下一篇关于类与对象的文章公布。
以上均为作者原创作品,如需引用,请联系作者,谢谢。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)