现在的位置: 首页 > 综合 > 正文

第三节 类和对象的基本概念(一)

2018年09月13日 ⁄ 综合 ⁄ 共 1892字 ⁄ 字号 评论关闭
文章目录

结构体默认情况下是共有的,类的成员在默认情况下是私有的

 

包括数据成员和成员函数

 

数据成员可以是任何的数据类型,但是不能用extern(外部型,不是在当前程序段分配内存),auto(自动型,不声明就是),register(寄存器型)指定它的存储类型,可以是static类型

不能在类的声明中给数据成员赋初值

class abc

{

    private:

        char a = a;   //错  定义类的时候只是在定义数据类型

};

 

成员函数要在类体内声明,还要在类外定义,成员函数在类内部定义就是内联函数

class point

{

    private:

        int x, y;

    public:

        void setpoint(int,int);

        int getX() {return x;}  //内联函数第一种表示

        inline int getY();   //内联函数第二种表示

};

void point::setpoint(int a, int b)

{

    x = a;

    y = b;

}

inline int point::getY()

{

    return y;

}

类外定义函数名前加  类名::

成员函数若有参数要有完整的参数说明

成员函数的返回类型应与函数原型声明的相同

 

对象

是类的一个实例

同类的多个对象占据内存的不同区域,每个对象保存的数据不同,但是用来操作数据的程序代码是一样的,即使用相同的成员函数

 

创建对象

class point

{

    int x,y;

}op1,op2;   //op1,op2是全局变量 

main ()

{

    point op3;  //op3是局部变量

}

 

对象赋值

两个对象赋值时,类型必须相同,两个对象分别占用不同的存储空间,若类的成员是指针类型,可能出错

 

使用同名对象时应加作用域运算符”::”

 

构造函数

构造函数与类名相同,是共有函数,不能指定返回类型,void也不行,不能显示调用

 

静态对象,只构造一次

全局对象,在执行main()之前调用

外部对象,程序并不为它调用构造函数

 

构造函数可以重载

为类定义了带参数构造函数时c++编译器不产生缺省构造函数

可以采用构造初始化表对数据成员进行初始化c++编译器也不产生缺省构造函数

 

拷贝构造函数

类型 (const 类名 &对象名);

类名::类名 (const 类名 &对象名){..//函数体} //没有反值(构造函数没反值

 

拷贝构造函数

如果没有定义拷贝构造函数,系统就会产生一个缺省的拷贝构造函数

如果所定义的类的数据成员是普通的变量(不是指针,不是数组),没必要写拷贝构造函数。如果有指针或者数组,如果构造函数中存在需要动态分配内存的数据成员,必须定义拷贝构造函数,不然会出错

 

调用拷贝构造函数的地方

新建对象

point p2(p1);

函数的形参是个对象,那么传递的时候体统就会调用实参的拷贝构造函数

void f(A a){...}

void main()

{

  A a;

  f(a);

}

 

如果函数的反值是个对象,这里也会调用拷贝构造

A fn(A &a){...return a;}

void main()

{

  f(fn());

}

 

对象赋值的时候也会调用拷贝构造函数

point p1(10,20);

point p2=p1;   //等价于point p2(p1);

 

数据类型转换

int num;    //Example try(num);

float x, float y;    //point p (x,y);

char A[]=Hello;    //String s(A);

 

析构函数

在类定义体中,与类同名,并在前面冠以”~”的成员函数

 

释放对象在构造时分配的资源

关闭被构造函数打开的文件

释放动态内存

 

对象的生命周期结束时,由体统自动调用

调用顺序与构造函数相反

析构函数没有返回类型,没参数,析构函数不能重载

 

 

数据成员是指针来代替数组,一开始不知道数组需要开多大的空间

等具体的时候再决定指针的数组需要多的内存空间,这样就不浪费

class string_data{

  char *str;

public:

  string_data(char*s)

  {

    str = new char[strlen(s)+1];

    strcpy(str,s);

  }

  ~string_data()

  {delete []str;}

  void get_info(char &);

  void sent_info(char *char);

}

抱歉!评论已关闭.