C++类和对象介绍

对象是C++和C之间最大的区别之一。C++最早的名字之一是C类。...

01

09年的

启动C++类

Hands typing on laptop

对象是C++和C之间最大的区别之一。C++最早的名字之一是C类。

类和对象

类是对象的定义。它是一种类似int的类型。类类似于结构,但只有一个区别:默认情况下,所有结构成员都是公共的。所有班级成员都是私人的。

记住——类是一种类型,而这个类的对象只是一个变量。

在使用对象之前,必须先创建它。类的最简单定义是:

类名{ //成员 }

下面的示例类为一本简单的书建模。使用OOP可以抽象问题并思考它,而不仅仅是任意变量。

//例一 #包括 #包括 课堂用书 { 整数页计数; int当前页面; 公众: 书籍(整数);//建造师 ~book(){};//析构函数 无效设置页(整数页码); int getcurrentpage(无效); }; 书:书(整数){ pagecount=numpages; } 无效书本::设置页(int页码){ currentpage=页码; } int book::getcurrentpage(无效){ 返回当前页面; } int main(){ 藏书(128); abook.setpage(56); std::cout<<“当前页面”<<abook.getcurrentpage()<<std::endl; 返回0; }

从类book到int book::GetCurrentPage(void){函数的所有代码都是该类的一部分。

02

09年的

理解书本课

在main()函数中,创建一个Book类型的变量ABook,其值为128。一旦执行达到这一点,对象ABook就被构造。在下一行,调用方法ABook.SetPage(),并将值56分配给对象变量ABook.CurrentPage。然后,cout通过调用Abook.GetCurrentPage()方法输出该值。

当执行到达返回0时;应用程序不再需要ABook对象。编译器生成对析构函数的调用。

声明类

类Book和}之间的所有内容都是类声明。此类有两个私有成员,均为int类型。这些成员是私有的,因为对类成员的默认访问是私有的。

public:指令告诉编译器从此处开始的访问是公共的。否则,它将仍然是私有的,并阻止main()函数中的三行访问Abook成员。试着对公众发表评论:排成一行并重新编译,以查看随后的编译错误。

下面这一行声明了一个构造函数。这是首次创建对象时调用的函数。

书籍(整数);//建造师

它是从电话线呼叫的

藏书(128);

这将创建一个名为ABook的Book类型的对象,并使用参数128调用Book()函数。

03

09年的

关于图书课的更多信息

在C++中,构造函数总是与类相同的名称。在创建对象时会调用构造函数,您应该将代码放在这里初始化对象。

在Book中,构造函数后面的下一行是析构函数。它与构造函数同名,但前面有一个~(tilde)。在销毁对象的过程中,调用析构函数来整理对象,并确保释放对象使用的内存和文件句柄等资源。

请记住,类xyz有一个构造函数xyz()和析构函数~xyz()。即使您没有声明,编译器也会默默地添加它们。

当对象终止时,始终调用析构函数。在本例中,对象在超出范围时被隐式销毁。要查看此情况,请将析构函数声明修改为:

~book(){std::cout<<“调用了析构函数”};//析构函数

这是一个内联函数,声明中包含代码。另一种内联方式是添加单词inline

内联~book();//析构函数

将析构函数添加为如下函数。

内联书本::~书本(无效){ std::cout<<“调用析构函数”; }

内联函数是编译器生成更高效代码的提示。它们应该只用于小的函数,但是如果在适当的地方使用,例如在内部循环中使用,可能会在性能上产生相当大的差异。

04

09年的

编写类方法

对象的最佳实践是使所有数据成为私有数据,并通过称为访问器函数的函数访问它。SetPage()和GetCurrentPage()是用于访问对象变量CurrentPage的两个函数。

将类声明更改为struct并重新编译。它仍应正确编译和运行。现在,PageCount和CurrentPage这两个变量可以公开访问。在书ABook(128)之后添加这一行,它将编译。

abook.pagecount=9;

若将struct改回class并重新编译,那个么新行将不再编译,因为PageCount现在又是私有的。

表示法

在Book类声明的主体之后,有四个成员函数的定义。每个都使用Book::前缀定义,以将其标识为属于该类:称为作用域标识符。它将函数标识为类的一部分。这在类声明中很明显,但在类声明之外则不明显。

如果在类中声明了成员函数,则必须以这种方式提供函数体。如果希望Book类被其他文件使用,那么可以将Book声明移动到一个单独的头文件中,可能称为Book.h。任何其他文件都可以将其包含在

#包括“book.h”

05

09年的

遗传与多态性

这个例子将演示继承。这是一个两类应用程序,其中一个类派生自另一个类。

#包括 #包括 类点 { int x,y; 公众: 点(int atx,int aty);//建造师 内联虚拟~point();//析构函数 虚空绘制(); }; 班级圈子:公共点{ 整数半径; 公众: 圆(intatx,intaty,inttheradius); 内联虚拟圈(); 虚空绘制(); }; 点::点(int atx,int aty){ x=atx; y=aty; } 内联点::~点(空){ std::cout<<“调用点析构函数”; } 空心点::绘制(空心){ 标准:cout<<点:在“<<x<<y<<std::endl”处绘制点; } 圆:圆(intatx,intaty,inttheradius):点(atx,aty){ 半径=半径; } 内联圆::~circle(){ std::cout<<”循环析构函数称为“<<std::endl; } 空心圆::绘制(空心){ point::draw(); 标准:cout<<“圆:绘制点”<<“半径”<<radius<<std::endl; } int main(){ 圆圈(10,10,5); acircle.draw(); 返回0; }

该示例有两个类:点和圆,用于对点和圆进行建模。点具有x和y坐标。圆类从点类派生并添加半径。这两个类都包含Draw()成员函数。为了使这个例子简短,输出只是文本。

06

09年的

遗产

类圆是从点类派生的。这是在这一行中完成的:

类圆:点{

因为它是从基类(点)派生的,所以Circle继承所有类成员。

点(int atx,int aty);//建造师 内联虚拟~point();//析构函数 虚空绘制(); 圆(intatx,intaty,inttheradius); 内联虚拟圈(); 虚空绘制();

将圆类视为具有额外成员(半径)的点类。它继承基类成员函数和私有变量x和y。

它不能分配或使用这些,除非是隐式的,因为它们是私有的,所以它必须通过循环构造函数的初始值设定项列表来完成。这是你现在应该接受的。在以后的教程中,我将回到初始值设定项列表。

在圆构造函数中,在将半径指定给半径之前,通过在初始值设定项列表中调用点的构造函数来构造圆的点部分。此列表是介于:和{之间的所有内容。

圆:圆(intatx,intaty,inttheradius):点(atx,aty)

顺便提一下,构造函数类型初始化可以用于所有内置类型。

int a1(10); int a2=10;

两者的作用相同。

07

09年的

什么是多态性(polymorphism)?

多态性是一个通用术语,意思是“许多形状”。在C++中,多态的最简单形式是函数的重载。例如,有几个名为SortArray(arraytype)的函数,其中SortArray可能是一个int或double数组。

不过,我们只对OOP形式的多态性感兴趣。这是通过在基类点中使函数(例如Draw())为虚函数,然后在派生类循环中重写它来实现的。

虽然函数Draw()在派生类循环中是虚拟的,但实际上并不需要它,它只是提醒我它是虚拟的。如果派生类中的函数在名称和参数类型上与基类中的虚函数匹配,则该函数自动为虚函数。

绘制点和绘制圆是两种完全不同的操作,只有点和圆的坐标是相同的,因此调用正确的Draw()非常重要。编译器如何生成获得正确虚拟函数的代码将在以后的教程中介绍。

08

09年的

C++构造函数

建设者

构造函数是初始化对象成员的函数。构造函数只知道如何构建自己类的对象。

构造函数不会在基类和派生类之间自动继承。如果您没有在派生类中提供一个,则将提供一个默认值,但这可能无法满足您的需要。

如果没有提供构造函数,那么编译器将创建一个默认构造函数,而不带任何参数。必须始终存在构造函数,即使它是默认值且为空。如果为构造函数提供参数,则不会创建默认值。

关于构造函数的一些要点:

  • 构造函数只是与类同名的函数。
  • 构造函数用于在创建类的实例时初始化该类的成员。
  • 构造函数不直接调用(除非通过初始值设定项列表)
  • 构造函数从来都不是虚拟的。
  • 可以为同一类定义多个构造函数。它们必须有不同的参数来区分它们。

关于构造函数还有很多需要了解的,例如,默认构造函数、赋值构造函数和复制构造函数。这些将在下一课中讨论。

09

09年的

整理C++析构函数

析构函数是一个类成员函数,它与构造函数(和类)同名,但前面有一个“~(tilde)”。

~circle();

当对象超出范围或很少被显式销毁时,将调用其析构函数。例如,如果对象有动态变量,如指针,则需要释放这些变量,析构函数是合适的位置。

与构造函数不同,如果您有派生类,析构函数可以而且应该是虚拟的。在Point and Circle类示例中,不需要析构函数,因为不需要进行清理工作(它只是一个示例)。如果存在动态成员变量(如指针),则需要释放这些变量以防止内存泄漏。

此外,当派生类添加需要整理的成员时,需要虚拟析构函数。虚拟时,首先调用最派生的类析构函数,然后调用其直接祖先的析构函数,依此类推到基类。

在我们的例子中,

~circle(); 然后 ~point();

基类析构函数称为last。

本课到此结束。在下一课中,了解默认构造函数、复制构造函数和赋值。

  • 发表于 2021-09-16 13:26
  • 阅读 ( 189 )
  • 分类:IT

你可能感兴趣的文章

倍数(multiple)和多层次遗传(multilevel inheritance)的区别

...—多重继承与多级继承 面向对象编程(OOP)是一种使用类和方法设计程序的范例。真实世界的场景可以映射到对象。因此,很容易构建软件解决方案。类是构建对象的蓝图。它包含属性和方法。例如,在创建student对象之前,应...

  • 发布于 2020-10-19 20:00
  • 阅读 ( 392 )

初学者最容易学习的6种编程语言

...为JavaScript实际上是一个糟糕的开端。Mombrea认为JS是面向对象编程的一个坏例子,而且它已经非常有名了。此外,虽然JS是非类型化的,这可能会提高编程效率,但错误直到运行时才会被发现。因此,他声称,如果你想从软件开发...

  • 发布于 2021-03-16 10:37
  • 阅读 ( 283 )

作文(composition)和继承(inheritance)的区别

...是OOP提供了一种新的类之间的关系,称为组合。通过在新类和现有类之间建立关系,新类可以从一个或多个现有类继承或嵌入代码。 在OOP中,继承是一个对象获取一个或多个其他对象特征的方法。它是在OOP中实现代码重用的最...

  • 发布于 2021-06-26 02:18
  • 阅读 ( 239 )

结构(structure)和C++类(class in c++)的区别

...型。 引用 1.Python字符串(带示例),可在此处找到。2.“类和对象简介。“计算机网络中的网络拓扑类型|学习之夜,可在这里获得。2.“类和对象简介”计算机网络中的网络拓扑类型|学习之夜, &#13;

  • 发布于 2021-07-01 09:32
  • 阅读 ( 605 )

基类(base class)和C++中派生类(derived class in c++)的区别

C++中基类和派生类的主要区别在于基类是已经存在的类,而派生类是继承基类的属性和方法的类。 C++是贝尔实验室Bjarne Stroustrup开发的一种高级通用编程语言。它是C语言的超集。程序员可以使用C++实现面向对象编程(OOP)概念...

  • 发布于 2021-07-01 14:50
  • 阅读 ( 743 )

单一的(single)和多重继承(multiple inheritance)的区别

...清楚地理解多重继承的概念。A、 B和C是三类。类C继承自A类和B类。因此,类C可以继承类A和B的属性和方法。 单一的(single)和多重继承(multiple inheritance)的区别 定义 单一继承是一种继承类型,使派生类能够从单个父类继承属性和...

  • 发布于 2021-07-01 18:31
  • 阅读 ( 254 )

抽象类(abstract class)和c中的接口#(interface in c#)的区别

在设计应用程序或开始编程生涯时,有必要了解C#中抽象类和接口的区别。抽象类和抽象接口都是用来完成抽象的,人们可以理解抽象方法。尽管它们不能同时使用。抽象类和接口在某些方面似乎相似,但有一些关键的区别,有...

  • 发布于 2021-07-07 04:15
  • 阅读 ( 445 )

JAVA(java)和javascript语言(javascript)的区别

...omparisonJavaJavaScript意义Java是一种通用编程语言,主要基于类和面向对象。JavaScript是一种符合ECMA脚本规范的编程语言。它是一个高层次的,通常是及时编译和多半径的。类型Java是一种面向对象的编程语言。JavaScript也是基于对象...

  • 发布于 2021-07-07 11:53
  • 阅读 ( 222 )

继承(inheritance)和多态性(polymorphism)的区别

...中只有一个超类,多继承有许多超类,层次继承有一个超类和多个子类,多继承是派生类派生的。如果我们谈论java,则使用一个特定的关键字extends,这个关键字用于继承类。多态性是多种形式的通用接口。您可以在编译时和运...

  • 发布于 2021-07-08 11:10
  • 阅读 ( 502 )

单一继承(single inheritance)和多重继承(multiple inheritance)的区别

...味着新类重用已经存在的类的属性。在继承派生类继承基类和访问时,说明符决定将继承哪个基类成员。继承的类型有单继承、层次继承、多级继承和混合继承。在单继承中,派生类只继承一个基类,而在多继承中,派生类继承...

  • 发布于 2021-07-08 11:14
  • 阅读 ( 650 )
cdwqbcdcpsoi
cdwqbcdcpsoi

0 篇文章

相关推荐