上回书说到,class有三个访问范围标识符,这次我们接着往下讲。
(若上一篇文章没看,赶紧回去补课,补课链接:c++class用法(通俗易懂,入门小白级)1/2_lazy orange775的博客-CSDN博客)
新人博主,制作不易,点个赞吧!求求求求了!!!
成员变量与函数:
成员变量声明方法跟普通变量一样,因为他们同属于一个类的成员,所以叫成员变量。
同样的,成员函数的声明方式也和普通函数一样。
一个类的成员函数之间可以互相调用。类的成员函数可以重载,也可以设定参数的默认值。
等等,那我们以前学的函数是啥?
像我们以前学的函数,他不是任何一个类的成员函数(孤零零),他们叫“全局函数”。
成员变量就代表对象的“属性”(就像int x,这里的x是整型的),成员函数就代表对象的“方法”(干什么),成员变量和成员函数出现的先后次序没有规定。
成员函数的实现可以位于类的定义之外,格式如下:
返回值类型 类名:函数名()
{
函数体
}
定义类之后,就可以定义对象了。定义对象的基本方法如下:
//类名为animal
类名+对象名;
例:
animal dog;
此处,“对象名”的命名规则和普通变量相同。对象也可以看作“成员变量”。
举个栗子:
下面来看一个用面向对象的方法进行 C++ 程序设计的例子:
题目:写个程序,输入长方形的长和宽,求面积和周长。
(哎呀,这个程序忒简单了,其实根本不用面向对象,你们说是吧?)
那写对这个程序要几步?
俩步!!!
STEP1:分析
首先要做的事情是分析问题中有哪些“对象”。比较明显,只有“长方形”这种对象。然后要进行“抽象”,即概括“长方形”这种对象的共同特点。
长方形的属性就是长和宽,所以要两个变量,代表长和宽。
一个矩形可以有哪些方法(即可以对矩形进行哪些操作)呢?在本程序中,矩形可以有设置宽度和高度、计算面积和计算周长三种行为,这三种行为可以各用一个函数实现,它们都会用到宽度和高度这两个变量。(那不废话吗)
STEP2:写代码
不废话,上代码!
#include <iostream>
using namespace std;
class CRectangle
{
public:
int w, h; //成员变量,宽和高
void init( int w_,int h_ ); //成员函数,设置宽和高
int area(); //成员函数, 求面积
int perimeter(); //成员函数,求周长
}; //必须有分号
void CRectangle::init( int w_,int h_ )
{
w = w_; h = h_;
}
int CRectangle::area()
{
return w * h;
}
int CRectangle::perimeter()
{
return 2 * ( w + h);
}
int main( )
{
int w,h;
CRectangle r; //r是一个对象
cin >> w >> h;
r.init( w,h);
cout << "It's area is " << r.area() << endl;
cout << "It's perimeter is " << r. perimeter();
cout << sizeof(CRectangle) << endl;
return 0;
}
栗子剖析:
第 3~10 行定义了一个类,类的名字就是 CRectangle。在 C++ 中,每个类的名字都是一种类型,可以像 int、double 等基本类型那样来使用。因此,CRectangle 也是一种程序员自己定义的类型的名字。
第 11~22 行是 CRectangle 类各个成员函数的具体实现。
定义 CRectangle 类后,就可以定义 CRectangle 类型的变量。在 C++ 中,通过类定义出来的变量称为“对象”。例如,第 26 行定义了一个 CRectangle 类型的变量 r,由于 CRectangle 是一个类,因此将 r 称为一个“对象”。
一般来说,在 C++ 中,一个对象占用的内存空间的大小等于其成员变量所占用的内存空间的大小之和。例如,一个 CRetangle 对象占用 8 个字节,因为它的两个成员变量 w 和 h 分别 占用 4 个字节。sizeof(CRectangle) 表达式的值是 8。
使用类的成员变量和成员函数可以用
对象名.成员名
的方式。例如:
- CRectangle r1, r2;
- r1.w = 5;
- r2.init(5, 4);
r1.w = 5;
这条语句直接对 r1 对象的 w 成员变量进行赋值。它不会影响 r2
用对象名.成员函数名
的方式可以调用成员函数,并且被调用成员函数是作用在该对象上的。例如,r2.init(5, 4);
这条语句就调用了 CRectangle 类的 init 成员函数,该成员函数执行时是作用在 r2 这个对象上的。
所谓成员函数作用在某个对象上,指的是进入该成员函数时,函数中访问到的成员变量是属于该对象的。例如,r2.init(5, 4);
这条语句在 init 函数执行期间访问的 w 和 h 就是属于 r2 这个对象的。执行r2.init(5, 4);
不会影响 r1。
同理,在上面的程序中,第 29 行和第 30 行的 area 和 perimeter 成员函数都是作用在 r 对象上 的,返回的就是 r 的面积和周长。
应该是其他的其他:
除了前面提到的对象名.成员名
方法,还可以用指针->成员名
的方式来访问对象的成员。例如:
- CRectangle rl, r2;
- CRectangle* p1 = &r1;
- CRectangle* p2 = &r2;
- p1 -> w = 5; //此处的 w 属于 p1 指向的对象
- p2 -> init(5, 4); //init函数作用在 p2 指向的对象上
还可用引用名.成员名
的方式访问对象的成员。例如:
- CRectangle r2;
- CRectangle & rr = r2;
- rr.w = 5;
- rr. init(5, 4); //rr的值改变,r2的值也改变
调用类的成员函数时,必须指明其所作用的对象。对于上面的 CRectangle 类来说,如果只写init(2, 4);
这条语句是不能编译通过的。因为编译器不清楚这个 init 函数是作用在哪个对象上面的,进入 init 函数以后,其中访问的 w 和 h 的内存地址在哪里无从知晓,因而也就无法编译了。
类还有另外一种写法,就是将 class 关键字换成 struct。例如:
- struct CRectangle{
- public:
- int w, h; //成员变量,宽度和高度
- void init(int w_, int h_); //成员函数,设置宽度和高度
- };
没有成员函数的 struct 还是称作“结构”,结构变量不是对象;有成员函数的 struct 就是类。
啪,讲完!!!
(内容小部分改编于http://c.biancheng.net/view/215.html)