我在上一篇文章中已经对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;
};
我在这里定义了一个类,这个类的名字叫人类,这个类里面有两个成员属性,一个是姓名,一个是银行卡密码,在public作用域下边有四个成员函数,分别用来设置(显示)姓名(银行卡密码),虽然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;
};
我在这里定义了一个圆类,可以看到圆类中包含着点类中的一个对象(圆心),在这里,可能有细心的读者发现了我在代码中并没有定义点类,而是用了“前向引用声明”这项技术,也就是先告诉编译器,我们有这样一个类,只不过还没有定义,这样编译器就不会报错,读者可以自行尝试一下如果将第一行的代码删去将会发生什么,当我们有一个类中用到了别的类中的对象,有两种方法,一是将别的类(本例中的点类)的定义放在前面,二就是利用“前向引用声明”这个技术,这个很简单,很好理解。
下面有道例题,读者可以自行去尝试一下,用到的就是上文所讲的点类与圆类,题目额如下:
利用点类与圆类,判断点和圆的位置关系。
答案会在下一篇关于类与对象的文章公布。
以上均为作者原创作品,如需引用,请联系作者,谢谢。