类和对象的概念与用法
- 从客观事物中抽象出类
例:写一个程序,输入矩形的长和宽,输出面积和周长。
-
矩形的属性是长和宽,因此需要两个变量分别表示长和宽
-
一个矩形的行为(或者可以对矩形进行的操作):设置长宽,计算面积,计算周长(还有很多,这里只针对本题)
-
行为各用一个函数实现,他们都需要长宽两个变量
-
将长宽变量和设置长宽,求面积,求周长的三个函数封装在一起,就能够形成一个“矩形类”
-
长宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数”,成员函数及成员变量统称为函数的类的成员
-
类像是带着函数的结构
class CRectangle
{
public:
int w,h;
int Area()
{
return w*h;
}
int Perimeter()
{
return 2*(w+h);
}
void Init(int w_,int h_)
{
w=w_;
h=h_;
}
};//必须有分号
-
注:由struct,class,做出来的都可以称为类,由类定义的变量称为对象
- 对象的内存分配
-
和结构变量一样,对象所占用的空间大小等于所有成员变量大小之和
-
对象不包含成员函数,成员函数只有一份,被成员变量所共享。
-
每个对象都有自己的存储空间,一个对象的某个成员变量被改变了,不会影响到另一个对象
- 对象间的运算
-
和结构变量一样,对象之间可以用“=”赋值,但是不能用"==","!=",">","<",">=","<="进行比较,除非这些运算符经过了重载
- 使用类的成员和成员函数
CRectangle r1,r2;
r1.w=5;
r2.Init(5,4);
CRectangle r1,r2;
CRectangle *p1=&r1;
CRectangle *p2=&r2;
p1->w=5;
p2->Init(5,4);//Init作用在p2指向的对象上
CRectangle r2;
CRctangle &rr=r2;
rr.w=5;
rr.Init(5,4);//rr的值变了,r2的值也变
例:
void Print(CRectangle &r)
{
cout<<r.Area()<<","<<r.Perimeter();
}
CRectangle r3;
r3.Init(5,4);
Print (r3);
则上述代码计算的是r3的面积与周长
- 类的成员函数和类的定义可以分开写
class CRectangle
{
public:
int w,h;
int Area();//
};
int CRectangle :: Area()
{
return w*h;
}
-
注:CRectangle ::
说明后面的函数是CRectangle类的成员函数,而非普通函数,那么一定要通过对象或对象的指针或对象的引用才能调用
- 类的成员的可访问范围
-
private:私有成员,只能在成员函数内访问
-
public:公有成员,可以在任何地方访问
-
protected:保护成员
以上三种关键字出现的次数和先后次序没有限制
格式###
class className()
{
private:
私有属性和函数
public:
共有属性和函数
protected:
保护属性和函数
};
若某个成员前面没有上述关键字,则缺省的认为是私有的
访问范围
1.当前对象的全部属性,函数
2.同类其他对象的全部属性,函数
-
在类成员函数以外的地方,只能访问该类的对象的公有成员
设置私有成员的机制称为“隐藏”
- 成员函数的重载和参数缺省
同一般函数的重载和参数缺省
使用缺省参数时要注意避免有函数重载时的二义性
例:
class Location
{
public:
void value X(int val=0){x=val;}
int value X(){return x;}
};
Location A;
A.value X();//编译错误,编译器无法判断调用哪个value X