了解C++类和对象

来源:互联网 发布:华资软件招聘 编辑:程序博客网 时间:2024/05/22 04:39

1.对象的概念:

所谓的”对象”是指现实世界中的一切事物。c++中说,“万物皆对象”。

2.类的概念:

“类”是用户自定义的数据类型,可以理解为c语言中结构体中的延伸和扩展。它拥有着自己的特征属性,被称为,“数据成员”,还有行为特征,被称为,“成员函数”。而我们熟悉的结构体中,只包括数据成员,实际在其中写成员函数,也不会报错的。

3.类和对象的关系:

在现实生活中,自行车,摩托车等都拥有着一些相似的属性和行为特征,我们可以把这些对象抽象封装成类。类是对象的抽象,对象是类的实例化。

4.类的声明和定义:

在定义结构体时我们用的关键字是,struct,而C++在定义类时有了新的关键字class。
其定义语法是,class+类名+
{
修饰词:
数据成员;
成员函数;
};(注意别忘了分号)
如,我们定义一个点类:

class Point{public:Point(){    cout << "没有参数的构造函数被调用了" << endl;    x = 1;    y = 2;}Point(int m, int n){    cout << "有两个参数的构造函数被调用了" << endl;    x = m;    y = n;}void display(){cout << "-----------------**************--------------";cout<< endl;cout << "点的坐标是" << "(" << x << ", " << y << ")" ;cout<< endl;cout << "-------------------**************--------------"; cout<< endl;}~Point(){cout << "析构函数被调用了" << endl;}private:int x;//点的横坐标int y;//点的纵坐标坐标};

在写代码时我们可以把成员函数在声明中便写出来,但是这样不便于阅读,也不美观,我们可以把声明和定义分开:

class Point{public:Point();Point(int m, int n);void display();~Point();private:int x;//点的横坐标int y;//点的纵坐标坐标};Point::Point(){cout << "没有参数的构造函数被调用了" << endl;x = 1;y = 2;}Point::Point(int m, int n){    cout << "有两个参数的构造函数被调用了" << endl;    x = m;    y = n;}void Point::display(){cout << "-----------------**************--------------";cout<< endl;cout << "点的坐标是" << "(" << x << ", " << y << ")" ;cout<< endl;cout << "-------------------**************--------------"; cout<< endl;}Point::~Point(){cout << "析构函数被调用了" << endl;}

在类外定义成员函数时要声明函数的作用域,用作用域限定符“::”双冒号。
我们定义了一个点类,class是创建类时的关键字,Point是类名,类名只要命名合法即可。public和private是数据成员或者成员函数的访问权限,下面会具体介绍。

5.数据成员或者成员函数的访问权限:

如上面的点类,类里有两个关键字,是public和private,这些就是声明数据成员和成员函数访问权限的关键字。
这些修饰词有三个,public,protected,private。
public是公有的,在类内或者类外均可以被访问的。
protected是受保护的,在类内和继承(先不用了解此概念)该类的类中可以被访问。
private是私有的,只能在类内被访问。

6.构造函数和析构函数:

构造函数:
构造函数是在创建对象时自动被调用的,不用自己去写,便会自己调用,当用类定义一个对象时便会自动执行,是隐式执行的。构造函数没有返回值,当然就没有返回类型,可以有参数也可以没有,没有参数的叫做默认构造函数,而多个构造函数就完成了对构造函数的重载,在定义对象时,会按照传来参数的不同,调用不同的构造函数。
构造函数与类名相同,如上面我定义的点类,Point()就是没有参数的构造函数,即默认构造函数,Point(int m,int n);就是有两个参数的构造函数。
构造函数的功能是给对象中的成员初始化。
构造函数有两种方式写

1.普通方式
请看上面点类中函数的定义实例。
2.初始化表的格式
如上面那个点类有两个参数的构造函数可以如此写:
前面一样,不同的是,赋值时,在函数名整体后+冒号+赋值变量1(值1)+赋值变量2(值2)+…

Point::Point(int m, int n):x(m),y(n){    cout << "有两个参数的构造函数被调用了" << endl;}

析构函数:
析构函数的声明格式是,~类名();波浪线+类名+英语半角的小括号。
析构函数没有参数,没有返回值,也不能重载。
析构函数完成的功能是对对象的销毁,以免内存一直被占用。当该对象到达生存周期时便会被销毁。
如上面的点类~Point()便是析构函数,因为我没有动态申请空间,所以没有必要写delete 动态申请的内存。
如果在程序中我们并没有写构造函数和析构函数,系统会自动帮我们生成。
在实际编写代码时我们没有必要写构造函数和构造函数中的文字,此处是为了读者能够看到是隐式调用而写的。

7.对象访问成员

对象在访问成员时,可以用对象加.(点)即成员访问符号,也可以使用引用,指针方式可以使用指针访问符号。
主函数中有如下代码:

    Point a;//隐式调用默认构造函数    Point b(1, 3);//隐式调用有两个参数的构造函数    Point &c = a;//引用    Point *ptr = &b;//指针ptr指向b    a.display();//成员访问符访问成员函数    cout << endl;    b.display();//成员访问符访问成员函数    c.display();//成员访问符访问成员函数    ptr->display();//指针访问符访问成员函数

运行结果如下:
这里写图片描述
通过此图可以看出构造函数和析构函数是隐式调用的。
也可以看到成员运算符(访问符)和指针访问符的功能。

原创粉丝点击