c++学习记录(四)

类和对象的概念与用法

- 从客观事物中抽象出类

例:写一个程序,输入矩形的长和宽,输出面积和周长。

  • 矩形的属性是长和宽,因此需要两个变量分别表示长和宽
  • 一个矩形的行为(或者可以对矩形进行的操作):设置长宽,计算面积,计算周长(还有很多,这里只针对本题)
  • 行为各用一个函数实现,他们都需要长宽两个变量
  • 将长宽变量和设置长宽,求面积,求周长的三个函数封装在一起,就能够形成一个“矩形类”
  • 长宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数”,成员函数及成员变量统称为函数的类的成员
  • 类像是带着函数的结构

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
原文地址:https://www.cnblogs.com/2002ljy/p/12244943.html