- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++OOP对象和类的详细讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文将从入门的角度介绍c++oop中的类和对象,事实上c++的类和对象远远不止本文所介绍的内容.
不过如果你感兴趣,我会把其他的内容逐一通过文章的形式介绍给你.
面向对象编程(oop)是一种特殊的、设计程序的概念性方法,c++通过一些特性改进了c语言,使得应用这种方法更加容易。下面是最重要的oop特性:
为了实现上述特性并把它们结合在一起,c++提供了类和对象.
我们首先来讨论一下oop。虽然c++偶尔讨论了oop,但更多的还是诸如c、pascal和basic等语言的标准过程性方法。下面看一个例子,它将揭示oop的核心观点与过程性编程的差别.
一般来说一场球赛的进球数量可以通过计算机来辅助计算例如每个选手的投球次数、命中率等等。如果这些由c++等利用oop编写程序,我们可以通过在一个函数中调用另一个函数,可以通过构建一个球队的类,或者建立一个球员的对象,通过调用函数的方式完成计算。而反观过程性编程,程序员需要用函数调用另一个函数来计算,用数组或变量等记录结果等等.
总之,如果采用过程性编程,首先考虑的是遵循的步骤,然后再考虑这些数据.
对于oop程序员,我们需要跟踪的就是球员,需要用一个对象表示整个选手的各个方面的表现.
采用oop,首先要从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成接口描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序.
生活中充满了复杂性,处理它们的方法就是简化和抽象.
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节.
数据抽象是一种依赖于接口和实现分离的编程(设计)技术.
让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、dvd 播放器),但是您不知道它的内部实现细节,也就是说,您并不知道它是如何通过缆线接收信号,如何转换信号,并最终显示在屏幕上.
因此,我们可以说电视把它的内部实现和外部接口分离开了,您无需知道它的内部实现原理,直接通过它的外部接口(比如电源按钮、遥控器、声量控制器)就可以操控电视.
现在,让我们言归正传,就 c++ 编程而言,c++ 类为数据抽象提供了可能。它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现.
例如,您的程序可以调用 sort() 函数,而不需要知道函数中排序数据所用到的算法。实际上,函数排序的底层实现会因库的版本不同而有所差异,只要接口不变,函数调用就可以照常工作.
类是一种将抽象转换为用户定义的c++工具,它将数据表示和操控数据的方法组合成一个整洁的包。下面我们来看看一个表示股票的类.
首先我们需要将股票的一股表示为一个基本单元,定义一个表示一股股票的类,然而,这意味着需要100个股票的单元才能构成100股。这将使工作量超标。相反,我们可以通过将某人持有的某种股票作为一个基本单元,数据表示中包含他所持有的股票数量.
具体地说,我们可以将执行的操作简化和限制为:
根据上述操作的需求来定义stock类的公共接口,我们可以通过调用接口来完成这些操作。而对于需要储存的信息,我们将它再次简化,我们最终将储存以下信息:
接口是一个共享的框架,共两个系统交互时使用。例如张三想要把银行里存的钱取走,需要在银行或者atm机取走他在银行系统里存的钱.
对于类,我们称为公共接口。在公共接口里,公共(public)是使用类的程序,而接口由程序员提供的调用类方法组成。例如,想要计算string对象包含多少个字符,我们无需打开对象,只需要使用其提供的size方法。方法size()便是用户与string类之间的公共接口.
c++ 在 c 语言的基础上增加了面向对象编程,c++ 支持面向对象程序设计。类是 c++ 的核心特性,通常被称为用户定义的类型.
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员.
定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作.
类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 box 数据类型,如下所示:
1
2
3
4
5
6
|
class
box {
public
:
double
length;
// 盒子的长度
double
breadth;
// 盒子的宽度
double
height;
// 盒子的高度
};
|
关键字public确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成员为 private或 protected.
类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 box 的两个对象:
box box1; // 声明 box1,类型为 box box box2; // 声明 box2,类型为 box 。
对象 box1 和 box2 都有它们各自的数据成员.
类的对象的公共数据成员可以使用直接成员访问运算符.来访问.
下面这个例子能帮助你理解上述概念 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#include <iostream>
using
namespace
std;
class
box
{
public
:
double
length;
// 长度
double
breadth;
// 宽度
double
height;
// 高度
// 成员函数声明
double
get(
void
);
void
set(
double
len,
double
bre,
double
hei );
};
// 成员函数定义
double
box::get(
void
)
{
return
length * breadth * height;
}
void
box::set(
double
len,
double
bre,
double
hei)
{
length = len;
breadth = bre;
height = hei;
}
int
main( )
{
box box1;
// 声明 box1,类型为 box
box box2;
// 声明 box2,类型为 box
box box3;
// 声明 box3,类型为 box
double
volume = 0.0;
// 用于存储体积
// box 1 详述
box1.height = 5.0;
box1.length = 6.0;
box1.breadth = 7.0;
// box 2 详述
box2.height = 10.0;
box2.length = 12.0;
box2.breadth = 13.0;
// box 1 的体积
volume = box1.height * box1.length * box1.breadth;
cout <<
"box1 的体积:"
<< volume <<endl;
// box 2 的体积
volume = box2.height * box2.length * box2.breadth;
cout <<
"box2 的体积:"
<< volume <<endl;
// box 3 详述
box3.set(16.0, 8.0, 12.0);
volume = box3.get();
cout <<
"box3 的体积:"
<< volume <<endl;
return
0;
}
|
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员.
让我们看看之前定义的类 box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员:
1
2
3
4
5
6
7
8
|
class
box
{
public
:
double
length;
// 长度
double
breadth;
// 宽度
double
height;
// 高度
double
getvolume(
void
);
// 返回体积
};
|
成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义。在类定义中定义的成员函数把函数声明为内联的,即便没有使用 inline 标识符。所以您可以按照如下方式定义 getvolume() 函数:
1
2
3
4
5
6
7
8
9
10
11
12
|
class
box
{
public
:
double
length;
// 长度
double
breadth;
// 宽度
double
height;
// 高度
double
getvolume(
void
)
{
return
length * breadth * height;
}
};
|
您也可以在类的外部使用范围解析运算符 :: 定义该函数,如下所示:
1
2
3
4
|
double
box::getvolume(
void
)
{
return
length * breadth * height;
}
|
在这里,需要强调一点,在 :: 运算符之前必须使用类名。调用成员函数是在对象上使用点运算符(.),这样它就能操作与该对象相关的数据.
这里需要注意的是,定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的。例如:
1
2
3
4
|
class
a
{
public
:
void
foo(
int
x,
int
y) { }
// 自动地成为内联函数
}
|
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:
1
2
3
4
5
6
7
8
|
// 头文件
class
a
{
public
:
void
foo(
int
x,
int
y);
}
// 定义文件
inline
void
a::foo(
int
x,
int
y){}
|
inline 是一种用于实现的关键字 。
关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用.
如下风格的函数 foo 不能成为内联函数:
1
2
|
void
foo(
int
x,
int
y);
inline
void
foo(
int
x,
int
y) {}
// inline 与函数定义体放在一起
|
而如下风格的函数foo 则成为内联函数:
1
|
void
foo(
int
x,
int
y);
inline
void
foo(
int
x,
int
y) {}
// inline 与函数定义体放在一起
|
现在我们来梳理一下上面所说的程序,如下所示 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include <iostream>
using
namespace
std;
class
box
{
public
:
double
length;
// 长度
double
breadth;
// 宽度
double
height;
// 高度
// 成员函数声明
double
getvolume(
void
);
void
setlength(
double
len );
void
setbreadth(
double
bre );
void
setheight(
double
hei );
};
// 成员函数定义
double
box::getvolume(
void
)
{
return
length * breadth * height;
}
void
box::setlength(
double
len )
{
length = len;
}
void
box::setbreadth(
double
bre )
{
breadth = bre;
}
void
box::setheight(
double
hei )
{
height = hei;
}
// 程序的主函数
int
main( )
{
box box1;
// 声明 box1,类型为 box
box box2;
// 声明 box2,类型为 box
double
volume = 0.0;
// 用于存储体积
// box 1 详述
box1.setlength(6.0);
box1.setbreadth(7.0);
box1.setheight(5.0);
// box 2 详述
box2.setlength(12.0);
box2.setbreadth(13.0);
box2.setheight(10.0);
// box 1 的体积
volume = box1.getvolume();
cout <<
"box1 的体积:"
<< volume <<endl;
// box 2 的体积
volume = box2.getvolume();
cout <<
"box2 的体积:"
<< volume <<endl;
return
0;
}
|
该程序被编译后执行,会得到下列输出 。
box1 的体积: 210box2 的体积: 1560 。
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/weixin_48985078/article/details/119859457 。
最后此篇关于C++OOP对象和类的详细讲解的文章就讲到这里了,如果你想了解更多关于C++OOP对象和类的详细讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!