前言
前面我们学习了c++的基础知识,但是c++的奥秘还远远没结束,现在开始学习c++中比较重要的知识点,面向对象的程序设计.
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序设计方法
用计算机语言编写程序,解决某些问题,成为程序设计,目前有两种重要的程序设计方法,一种是面向过程的程序设计,还有一种就是面向对象的程序设计方法。
二、初步认识面向对象程序设计
1.面向是对象的设计方法
用例子来讲解一下吧;
要求计算一个矩形的面积;
代码如下(示例):
//c++面向对象教程; #include<iostream> using namespace std; class RectangleArea { public: void SetData(float L, float W); float ComputeArea(); void OutputArea(); private: float length, width, area; }; void RectangleArea::SetData(float L, float W) { length = L; width = W; } float RectangleArea::ComputeArea() { area = length * width; return area; } void RectangleArea::OutputArea() { cout << "area=" << area << endl; } int main(void) { RectangleArea Rectangle;//声明对象; Rectangle.SetData(8, 9); Rectangle.ComputeArea(); Rectangle.OutputArea(); }
对象是计算机内存中的一块区域,在对象中不但存有数据,还有代码。这使得每个对象都相互独立是,当然对象之间也可以进行联系,不过要通过消息进行联系。
程序=对象+消息;
2.从C到C++
c++程序的基本组成
引入代码如下(示例):
#include<iostream> using namespace std; int main() { cout<<"Hello every student"<<<endl; return 0; }
文件包含命令
文件包含命令#include,其作用是将某一个源文件并入当前的源文件程序,其形式有以下两种:
(1).#include<文件名>
这种模式一般用于c++的库函数,按照标准模式去c++函数库中寻找。
(2),#include"文件名"
这种模式一般用于用户自己定义的文件,先到当前的文件夹寻找,然后才到c++标准库中寻找。
#include在该程序中,为程序设置了c++的相关环境。c++编译系统自带两种头文件,一种是以".h"为后缀的头文件,称为非标准库。还有一种是不以".h"为后缀的头文件一般前面都会加"c"作为前缀。在使用这两种头文件的时候,编译系统会自动连接系统库,但是不能同时使用这两种类型的头文件。
针对名字空间的指令
一个软件往往由多个模块组合而成,其中包括由不同的程序员开发的组件和类型库提供的组件,这样不同的模块之间在对标识符命名时,就有可能发生命名冲突。故,c++提供了名字空间(namespace)来防止命名的冲突。文件中定义的所有变量和函数都在名字空间std中;
类与对象
类
类就是用户自定义的一个数据类型,和其他数据类型有点不同的是,它包含数据,函数,和c语言中的结构体相似,但是比结构体多了一个定义的函数模块;
数据成员用来描述对象的属性,可以像声明普通变量的方式来声明。并且允许是任何数据类型,包括用户自定义的类类型(但不允许是当前正在定义的类,除非使用指针形式)。类中的数据不允许被初始化。
类成员的访问控制
关键字public,protected,private均用于控制类中成员在程序中的课访问性。
成员函数的实现
成员函数的实现可以放在类体中,也可放在类体外(必须在类体中给出函数原型说明),放在类体中的函数默认为内联函数(inline),而放在类体外的默认是一般函数,但是如果要声明内联函数,可以用关键字inline来定义.
类体中函数的一般形式:
<返回类型><类名>::<成员函数名>(<参数>);
"::“是作用域运算符;”<类名>::"表明其后的成员函数是在这个类体中声明的。可以直接对类体中的成员直接访问。
类体中的实现;
class Point { public: void setxy(int x, int y) { X = x; Y = y; } void displayxy() { cout << "(" << x << "," << y << ")" << endl; } private: int X, Y; };
构造函数
c++程序中的初始化和清理工作,分别由两个特殊的函数来完成,他们分别叫做构造函数和析构函数。下面我们来认识构造函数。
构造函数的特点:构造函数是一种特殊的成员函数,对象的初始化工作可以由他来完成。
格式:<类名>::<类名>(<形参表>);
构造函数应该被声明为公有函数,应为他是在创建对象的时候自动被调用。
(1).他的函数名与类名相同。
(2).他可以重载;
(3).不能指定返回类型,void类型也不可以。
(4).不能显示被调用,他在创建对象的时候自动被调用;
//示例构造函数的用法 #include<bits/stdc++.h> using namespace std; class Point { public: Point(); Point(int);//默认构造函数; Point(int, int); void displayxy(); private: int X, Y; }; //点类的实现部分; Point::Point() { X = 7; Y = 8; cout << "Default constructor is called!"; displayxy(); } Point::Point(int x) { X = x; Y = 8; cout << "Constructor is called!"; displayxy(); } Point::Point(int x, int y) { X = x; Y = y; cout << "Constructor is called!"; displayxy(); } void Point::displayxy() { cout << "(" << X <<"," << Y<<")" << endl; } int main() { Point p1(3, 4), p2[2] = { 5,6 }, p3; return 0; } /*提示,由于我们在这个函数中已经定义了构造函数, 故系统不会再自己生成构造函数,为了创建没有初始化值 的p3对象就必须自己定义一个构造函数; */
2.默认构造函数
默认构造函数就是没有参数的构造函数,既可以是自己定义的,也可以是系统自己生成的。在程序中声明一个没有使用初始值的对象时,系统自动调用默认构造函数创建该对象。
析构函数
析构函数也是一种特殊的成员函数,它的作用是对象消失时执行一项清理任务。
格式:<类名>::~<类名>
{
<函数体>
}
析构函数应该被声明为公有函数,应为他是在创建对象的时候自动被调用。
(1).析构函数的函数名为类名,不同的是,在前面加了一个~符号,表示和构造函数功能相反;
(2).析构函数没有参数,不能重载,一个程序只能有一个析构函数。
(3).析构函数没有返回值,void类型也不行;
(4).析构函数在一个对象清理的时候会自动被调用,它可以显示被调用,但不提倡.
//示例构造函数的用法 #include<bits/stdc++.h> using namespace std; class Point { public: Point(); Point(int);//默认构造函数; Point(int, int); ~Point(); void displayxy(); private: int X, Y; }; //点类的实现部分; Point::Point() { X = 7; Y = 8; cout << "Default constructor is called!"; displayxy(); } Point::Point(int x) { X = x; Y = 8; cout << "Constructor is called!"; displayxy(); } Point::Point(int x, int y) { X = x; Y = y; cout << "Constructor is called!"; displayxy(); } void Point::displayxy() { cout << "(" << X <<"," << Y<<")" << endl; } Point::~Point() { cout << "Destructor is called!"; displayxy(); } int main() { Point p1(3, 4), p2[2] = { 5,6 }, p3; return 0; }
通过程序分析,构造函数被调用的时候和声明对象的顺序一样,而析构函数的调用顺序和构造函数调用顺序正好相反;
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,他的作用是用一个已经存在的对象去初始化另一个队像,为了保证所引用的对象不被改变,通常把引用参数声明为const参数。
格式:
<类名>::<类名>(const<类名>&(对象名))
{
函数体
}
(1).拷贝构造函数名字与类名相同,并且不能返回指定类型;
(2).拷贝函数只有一个参数,并且该参数是该类的对象的引用。
(3).它不能被显示调用,在以下三种情况下会被自动调用。
//示例构造函数的用法 #include<bits/stdc++.h> using namespace std; class Point { public: Point(); Point(int);//默认构造函数; Point(int, int); ~Point(); Point(const Point& ); void displayxy(); private: int X, Y; }; //点类的实现部分; Point::Point() { X = 7; Y = 8; cout << "Default constructor is called!"; displayxy(); } Point::Point(int x) { X = x; Y = 8; cout << "Constructor is called!"; displayxy(); } Point::Point(int x, int y) { X = x; Y = y; cout << "Constructor is called!"; displayxy(); } void Point::displayxy() { cout << "(" << X <<"," << Y<<")" << endl; } Point::~Point() { cout << "Destructor is called!"; displayxy(); } Point::Point(const Point& p) { X = p.X; Y = p.Y; cout << "Copy constructor is called!"; displayxy(); } Point func(Point p) { int x = 10 * 2; int y = 10 * 2; Point pp(x, y); return pp; } int main() { Point p1(3, 4), p2[2] = { 5,6 }, p3; Point p4 = p1; p4 = func(p1); return 0; }
2.默认拷贝构造函数
如果一个类中没有定义拷贝构造函数,则系统会自动生成一个默认的拷贝构造函数,该函数的功能是将已知对象的所有数据成员的值拷贝给对应的对象的所有数据成员。
临时对象
上述的程序我们可以发现,在函数func中,我们定义了一个临时对象pp,临时对象在执行完后,会自动释放。
临时对象的作用:
总结
本节我们学习了c++类中的相关知识,这些函数只是我们了解对象的一个过程,不需要背代码,但是要理解其中的相关含义。