Visual C++面向对象编程.docx

上传人:b****5 文档编号:8148251 上传时间:2023-01-29 格式:DOCX 页数:12 大小:18.78KB
下载 相关 举报
Visual C++面向对象编程.docx_第1页
第1页 / 共12页
Visual C++面向对象编程.docx_第2页
第2页 / 共12页
Visual C++面向对象编程.docx_第3页
第3页 / 共12页
Visual C++面向对象编程.docx_第4页
第4页 / 共12页
Visual C++面向对象编程.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Visual C++面向对象编程.docx

《Visual C++面向对象编程.docx》由会员分享,可在线阅读,更多相关《Visual C++面向对象编程.docx(12页珍藏版)》请在冰豆网上搜索。

Visual C++面向对象编程.docx

VisualC++面向对象编程

七、面向对象编程

1、面向对象

将储存在结构中的数据与过程的功能组合成一个单元。

2、创建新类型

在C++中,程序员可以通过创建所需的任何类型来扩展该语言,每种新类型都可以有与内置类型相同的功能。

通过将相关变量组合成结构,提供了C语言中增加新类型的功能。

使用typedef语句,可让结构成为一种新的数据类型。

typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。

3、类和成员

类:

将一组变量(它们的类型通常不同)和一组相关的函数组合在一起。

类可以由各种类型的变量组成,还可以包含其它类对象。

类中的变量被称为成员变量或数据成员。

成员变量是类的组成部分。

类还可以包含函数,它们被称为成员函数或方法。

成员函数也是类的组成部分。

类中的成员函数通常操纵成员变量。

声明类:

类声明将有关类的信息告诉编译器。

要声明类,课使用关键字class,后跟类名、左大括号、数据成员列表和方法,然后是右大括号和分号。

例:

classCat

{

intitsAge;

intitsWeight;

voidMeow();

};

注意:

a、必须给所有成员变量、成员函数和类命名。

定义对象:

声明一个类后,便可以将其用作新类型来声明这种类型的变量。

声明新类型对象的方式与声明整型变量相同。

例:

intage;

CatTom;

4、访问类成员

定义实际的Cat对象(如CatTom)后,便可以使用句点运算符(.)来访问该对象的成员。

使用方法:

Tom.itsAge=3;

Tom.Meow();

给对象赋值,而不是给类赋值。

例:

Cat.itsAge=3//wrong

正确的方法是:

CatTom;//就像intx;

Tom.itsAge=3;//就像x=5;

类不能有没有声明的功能。

例:

CatTom;

Tom.Bark();//类中没有定义Bark函数,因此猫不能叫

注意:

a、声明和定义不能混为一谈。

声明指出类是什么,定义为对象分配内存。

a、不能将值赋给类,而应该将值赋给数据成员。

5、私有和公有

在类中声明还常常使用其他关键字,其中最重要的两个是public和private。

关键字public和private用于类的成员:

数据成员和成员方法。

私有成员只能在类的方法中访问;公有成员可以通过类的任何对象进行访问。

默认情况下,所有成员都是私有的。

例:

classCat

{

intitsAge;

intitsWeight;

voidMeow();

};

intmain()

{

CatTom;

Tom.itsAge=3;//错误!

不能访问私有数据

}

声明公有成员:

classCat

{

public:

intitsAge;

intitsWeight;

voidMeow();

};

//此程序用于演示访问一个简单类的公有成员

#include

classCat

{

public:

intitsAge;

};

intmain()

{

usingstd:

:

cout;

usingstd:

:

endl;

CatTom;

Tom.itsAge=3;

cout<<"Tom是一只"<

"<

return0;

}

使用数据成员私有:

一个通用的设计规则是,应让类的数据成员私有。

为访问类中的私有数据,必须创建被存取器方法(accessormethod)的公有函数。

这些方法用于设置和获取私有成员变量,它们是成员函数可以在程序的其它地方调用它们来获取和设置私有成员变量的值。

存取器函数让你能够将数据的存储细节和使用细节分开,通过使用存取器函数,以后修改数据的存储方式时,不必重新编写使用这些数据的函数。

存取器函数还可以包含其他逻辑。

比如Cat的年龄不太可能大于100等。

//这是一个包含存取器方法的类

#include

classCat

{

public:

intGetAge();

voidSetAge(intAge);

intGetWeight();

intSetWeight(intWeight);

voidMeow();

private:

intitsAge;

intitsWeight;

};

要设置Tom的年龄,可以将年龄传给SetAge()函数。

如:

CatTom;

Tom.SetAge(3);

注意:

a、务必将存取器函数声明为公有。

b、必须通过类的成员函数来访问私有成员变量。

c、尽可能不要将成员变量声明为公有。

d、不要试图在类的外部使用私有成员变量。

6、实现类方法

存取器函数提供了到类的私有成员数据的公有接口。

每个存取器函数以及声明的其他类方法都必须有实现。

实现被称为函数的定义。

成员函数的定义类似于常规函数:

首先指出函数的返回类型,如果函数不返回任何值,则使用void。

然后是类名、两个冒号、函数名和参数。

//此程序用于演示实现一个简单类的方法

#include

classCat

{

public:

intGetAge();

voidSetAge(intAge);

voidMeow();

private:

intitsAge;

};

intCat:

:

GetAge()

{

returnitsAge;

}

voidCat:

:

SetAge(intAge)

{

itsAge=Age;

}

voidCat:

:

Meow()

{

std:

:

cout<<"Meow~\n";

}

intmain()

{

CatTom;

Tom.SetAge(3);

std:

:

cout<<"Tom是一只";

std:

:

cout<

\n";

Tom.Meow();

return0;

}

7、构造函数和析构函数

初始化类的成员函数,可以使用一个特殊的成员函数:

构造函数。

构造函数可以根据需要接受参数,但它不能有返回值——连void都不行。

构造函数是一个与类同名的类方法。

声明构造函数后还应声明析构函数。

构造函数声明并初始化类对象,而析构函数在对象被销毁后完成清理工作并释放(在构造函数或对象的生命周期中)分配的资源或内存。

析构函数总是与类同名,但在前加上了一个(~)。

析构函数没有参数也没有返回值。

如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。

例:

为Cat声明一个析构函数

~Cat();

默认构造函数和析构函数:

没有参数的构造函数被称为默认构造函数。

编译器创建的默认构造函数和析构函数不仅没有参数,而且不执行任何操作。

如果希望它们执行一些操作,必须创建自己的默认构造函数或析构函数。

使用默认构造函数

在某种程度上说,所有对象都必须被构造和析构,在构造和析构过程中,将调用这些不执行任何操作的函数。

声明对象时不用传递任何参数。

如:

CatTom;

必须有一个下面这样的构造函数:

Cat();

创建对象时将调用构造函数。

若Cat构造函数接受两个参数,则:

CatTom(3,5);

第一个参数可能是年龄,第二个参数可能是重量。

若构造函数为默认构造函数,则:

CatTom;//对象后没有括号

//此程序用于演示使用构造函数和析构函数

#include

classCat

{

public:

Cat(intAge);

~Cat();

intGetAge();

voidSetAge(intage);

voidMeow();

private:

intitsAge;

};

Cat:

:

Cat(intAge)

{

itsAge=Age;

}

Cat:

:

~Cat()

{

}

intCat:

:

GetAge()

{

returnitsAge;

}

voidCat:

:

SetAge(intage)

{

itsAge=age;

}

voidCat:

:

Meow()

{

std:

:

cout<<"Meow~\n";

}

intmain()

{

CatTom(3);

std:

:

cout<<"Tom是一只"<

\n";

Tom.Meow();

return0;

}

8、const成员函数

关键字const可以用来声明不能修改的变量。

也可将关键字const用于类中的成员函数。

要将类方法声明为const,可在方法声明中将所有参数括起的括号和分号之间放置关键字const。

如:

voidsomeFunction()const;

由于它被声明为const,因此不会修改其所属类的任何数据成员。

如果将一个函数声明为const的,而该函数的是实现通过修改某个成员变量的值而修改了对象,编译器将视其为错误。

尽可能将方法声明为const的,是一种良好的编程习惯。

这样让编译器捕获错误,而不致于称为等到程序运行时才出现bug。

9、类声明和方法定义的位置

为类声明的每一个函数都必须有定义,这种定义被称为函数实现。

定义必须位于编译器能够找到的文件中。

也可以将声明放在实现文件中,但这不是一种好的编程习惯。

大多数程序员采用的约定是,将声明放在头文件中,该头文件的名称与实现文件相同,但扩展名为.h、.hp或.hpp。

例:

可以将Cat类的声明放在一个名为Cat.hpp的文件中,而将类方法的定义放在一个名为Cat.cpp的文件中。

然后在Cat.cpp的开头加入如下代码,将头文件同.cpp文件关联起来:

#include“Cat.hpp”

这段代码告诉编译器,将Cat.hpp读入文件中。

10、内联实现

就像可以请求编译器将常规函数内联一样,也可以将类方法内联,只需在返回类型前加上关键字inline。

例:

inlineintCat:

:

GetWeight()

{

returnitsWeight;

}

也可以将函数的定义放到类声明中,这样,函数将自动成为内联的。

如:

classCat

{

public:

intGetWeight(){returnitsWeight;}

voidSetWeight(intaWeight);

}

内联函数的函数体紧跟在类方法声明之后,圆括号后没有分号。

11、将他类用作成员数据的类

一种常见的创建复杂类的方法是,首先声明较简单的类,然后再将其包含到较复杂的类的声明中。

先创建一个头文件,声明一个完整的类。

//声明一个完整的类

//点、线、面积

#include

classPoint//声明一个类,储存点的坐标x,y

{

public:

voidSetX(intx){itsX=x;}

voidSetY(inty){itsY=y;}

intGetX()const{returnitsX;}

intGetY()const{returnitsY;}

private:

intitsX;

intitsY;

};

classRectangle

{

public:

Rectangle(inttop,intleft,intbottom,intright);

~Rectangle(){}

intGetTop()const{returnitsTop;}

intGetLeft()const{returnitsLeft;}

intGetBottom()const{returnitsBottom;}

intGetRight()const{returnitsRight;}

PointGetUpperLeft()const{returnitsUpperLeft;}

PointGetLowerLeft()const{returnitsLowerLeft;}

PointGetUpperRight()const{returnitsUpperRight;}

PointGetLowerRight()const{returnitsLowerRight;}

voidSetUpperLeft(PointLocation){itsUpperLeft=Location;}

voidSetLowerLeft(PointLocation){itsLowerLeft=Location;}

voidSetUpperRight(PointLocation){itsUpperRight=Location;}

voidSetLowerRight(PointLocation){itsLowerRight=Location;}

intGetArea()const;

private:

PointitsUpperLeft;

PointitsLowerLeft;

PointitsUpperRight;

PointitsLowerRight;

intitsTop;

intitsLeft;

intitsBottom;

intitsRight;

};

//包含类Rectangle

#include"Rectangle.h"

Rectangle:

:

Rectangle(inttop,intleft,intbottom,intright)

{

itsTop=top;

itsLeft=left;

itsBottom=bottom;

itsRight=right;

itsUpperLeft.SetX(left);

itsUpperLeft.SetY(top);

itsUpperRight.SetX(right);

itsUpperRight.SetY(top);

itsLowerLeft.SetX(left);

itsLowerLeft.SetY(bottom);

itsLowerRight.SetX(right);

itsLowerRight.SetY(bottom);

}

intRectangle:

:

GetArea()const

{

intWidth=itsRight-itsLeft;

intHeight=itsTop-itsBottom;

return(Width*Height);

}

intmain()

{

RectangleMyRectangle(100,20,50,80);

intArea=MyRectangle.GetArea();

std:

:

cout<<"面积为:

\t"<

std:

:

cout<<"左上角点的横坐标为:

";

std:

:

cout<

std:

:

cout<<"\n";

return0;

}

12、结构

与关键字class极其相似的一个关键字struct,它用来声明结构。

在C++中,结构与类相同,只是其成员默认为公有的。

可以像声明类一样声明结构,并给它声明数据成员和函数。

—q83831295

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1