C++基础学习笔记——对象的定义及引用

2023-11-10

1 . 类与对象的关系

通常我们把具有同样性质和功能的东西所构成的集合称为类。在C++中,可以把相同内部存储结构和相同操作集的对象看成属于同一类。
在C++中,对象是类的实际变量。类与对象间的关系,可以用整型 int 和整型变量 i 之间的关系来类比。类和整型 int 均代表的是一般的概念,而对象和整型变量 i 却是代表 具体的东西。正像定义 int 类型的变量一样,也可以定义类的变量。C++把类的变量称为类的对象,对象也称为类的实例。

2 . 对象的定义

可以用以下两种方法定义对象。
(1)在声明类的同时,直接定义对象,即在声明类的右花括号“}”后,直接写出属于该 类的对象名表。例如:

class point 
{
private : 
	int x, y; 
public: 
	void setpoint(int, int) ;
	int getx( ) ;
 	int gety( ) ;
} op1, op2;

在声明类 point 的同时,直接定义了对象 op1 和 op2,这时定义的是一个全局对象。
( 2 ) 声明了类之后,在使用时再定义对象, 定义的格式与一般变量的定义格式相同,如下所示:

point op1 ,op2;

此时定义了 op1 和 op2 为 point 类的两个对象。

说明
(1) 声明了一个类便声明了一种类型,它并不接收和存储具体的值,只作为生成具体对象的一种“样板”,只有定义了对象后,系统才为对象并且只为对象分配存储空间
(2)在声明类的同时定义的对象是一种全局对象,在它的生存期内任何函数都可以使用它。但有时使用它的函数只在极短的时间对它进行操作,而它却总是存在,直到整个程序运行结束,采用使用时再定义对象的方法可以消除这种弊端。

3.对象的引用

在此,对象的引用是指对对象成员的引用。不论是数据成员,还是成员函数,只要是公有的,就可以被外部函数直接引用,引用格式是:
对象名.数据成员名

对象名.成员函数名( 实参表)
其中“.”叫做对象选择符,简称点运算符

下面的例子中定义了 point 类的两个对象 op1 和 op2,并引用这两个对象的成员进行 了一些操作。

# include <iostream.h>
class point
{ 
private: 
	int x, y; 
public: 
	void setpoint(int a, int b) 
	{ 
		x = a ; y = b; 
	} 
	int getx ( ) 
	{ 
		return x; 
	} 
	int gety( ) 
	{ 
		return y; 
	} 
} ;

void main ( ) 
{
	point op1, op2; 
	int i, j; 
	op1.setpoint(1, 2 ) ; // 调用op1的 setpoint( ),初始化对象op1
	op2.setpoint(3, 4 ) ; // 调用op2的setpoint( ),初始化对象op2 
	i = op1.getx( ) ; // 调用 op1 的 getx( ),取op1的x值 
	j = op1.gety( ) ; // 调用 op1 的 gety( ),取op1的y值 
	cout << "op1 i = ”" << i << "op1 j = " << j << endl; 
	i = op2.getx( ) ; // 调用op2的getx( ),取op2的x值 
	j = op2.gety( ) ; // 调用op2的gety( ),取op2的y值 
	cout << "op2 i = " << i << "op2 j = " << j << endl;
}

程序运行结果如下:

op1 i = 1  op2 j = 2 
op2 i = 3  op2 j = 4

说明:
(1)本例中 op1.setpoint( 1, 2) 实际上是一种缩写形式,它表达的意义是 op1.point∷ setpoint( 1, 2),这两种表达式是等价的。
(2)外部函数不能引用对象的私有成员。如果将例 3.3中的主程序改成下面的形式:

void main( ) 
{
	point op; 
	int i, j; 
	op.setpoint( 1, 2) ; 
	i = op.x; // 错误, 不能直接引用对象的私有成员
	j = op.y; // 错误, 不能直接引用对象的私有成员 
	cout << "op x = " << i << "op y = " << j << endl; 
}

则编译这个程序时,编译器将指示这两条语句的错误。这时可将这两条错误语句改成调用公有的成员函数来获得私有数据成员 x 和 y 的值,如下所示:

i = op.getx( ) ;
j = op.gety( ) ;

修改后,程序运行结果如下:

op x = 1 op y = 2

( 3 ) 在定义对象时,若我们定义的是指向此对象的指针,则访问此对象的成员时,不 能用“.”操作符,而应使用“ - > ”操作符,例如:

void main( ) 
{
	point * op; 
	op -> setpoint( 1, 2) ; 
	// … 
}
4 . 对象赋值语句

如果有两个整型变量 x 和 y,那么用 y = x,就可以把 x 的值赋给 y。同类型的对象之间也可以进行赋值,当一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝。例如, A 和 B 是同一类的两个对象,假设 A 已经存在,那么下述对象赋值语句把对象 A 的值逐位拷贝给对象 B:
B = A
下面我们看一个使用对象赋值语句的例子。

# include <iostream.h> 
class myclass
{ 
	int a , b; 
public: 
	void set( int i, int j) 
	{ 	
		a = i; 
		b = j; 
	} 
	void show( ) 
	{ 
		cout << a << " " << b << endl; 
	} 
};

main ( ) 
{
	myclass o1, o2; 
	o1.set(20, 5);
	o2 = o1; // 将对象 o1 的值赋给对象 o2 
	o1.show( ); 
	o2.show( ); 
	return 0; 
}

在该程序中,语句:
o2 = o1;
等价于语句::
o2.a = o1.a;
o2.b = o1.b;
因此,运行此程序将显示:
20 5
20 5

说明
(1) 在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如对象的类型不同,编译时将出错。
(2)两个对象之间的赋值,仅仅使这些对象中数据相同,而两个对象仍是分离的。例 如本例对象赋值后,再调用 o1.set( ) 设置 o1 的值,不会影响 o2 的值。
(3)将一个对象的值赋给另一个对象时,多数情况下都是成功的,但当类中存在指针时,可能会产生错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础学习笔记——对象的定义及引用 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • Java+MysQL:Java连接MysQL及进行简单的查询操作

    最近想学习一下Java操作MySQL等数据库的教程 但是把整个网络翻遍也没找到令人满意的教程 各种报错 所以就决定 把自己的学习过程记录下来和大家分享 既可以作为日后复习巩固之用 又可以帮到需要的人 希望可以帮助以后想学习的朋友们少走一些弯
  • Android通知发送原理之Framework实现(基于Android 10)

    前言 这是一个基于 Android 10 源码 全面分析 Android通知系统实现原理 的系列 这是第三篇 全系列将覆盖 这一篇我们将全面分析通知发送在框架层 服务端 的一系列处理 说明 下文出现的简写 NM gt Notificatio
  • 关于组播239.255.255.250

    网络很慢 用SNIFFER监控 观察到内网一个IP10 192 68 66与239 255 255 250有着大量的数据传送 占据大量带宽 各位同仁有没有遇到类似情况 小虾初步怀疑是有人在网内看网络电视导致的 曾经在一个论坛里看见说是一个播
  • Spring Boot项目结构推荐

    Spring Boot框架本身并没有对项目结构有特别的要求 但是按照最佳实践的项目结构可以减少可能会遇见的坑 尤其是Spring包扫描机制的存在 也可以免去不少特殊的配置工作 典型示例一 root package结构 com lyd exa
  • HTML5 WebSocket的入门使用

    HTML5 WebSocket 长连接 客户端与服务端可以保持长时间的通信 一 具体步骤 1 创建一个websocket实例 连接远程服务器并且需要一个连接服务器的url let baseUrl ws echo websocket org
  • Flutter 图表控件使用笔记

    Flutter 图表控件使用笔记 最近有图表绘制需要 记录下现有的Flutter主流实现方式 原文链接 https blog csdn net weixin 44259356 article details 105147636 flutte
  • 数据库复习(4) 实体关系模型

    实体集 Entity Sets 是实际存在的事物 可以是抽象的 具有属性 attributes 实体集是具有共同性质的同类实体的集合 实体集的属性类型划分 简单的和复合的 conposite 如名字等等 单值的 多值的 如电话号码等 直接的
  • (规定时间过桥问题)A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时 1、2、5、10 分钟

    问题描述 A B C D 四个人 要在夜里过一座桥 他们通过这座桥分别需要耗时 1 2 5 10 分钟 只有一支手电 并且同时最多只能两个人一起过桥 请问 如何安排 能够在17分钟内这四个人都过桥 解答思路 核心思想 过桥需要手电 每次让相
  • STM32学习——GPIO

    GPIO就是通用的输入输出端口 通俗的说就是单片机的一些引脚 这些引脚可以控制LED灯 蜂鸣器也可以作为按键输入 ADC采样等 从而实现STM32单片机和外部硬件之间的连接和数据交互 在STM32中以STM32F103C8T6为例 其GPI
  • # `CSP_J_2021` 第一轮认证题

    一 单选题 1 以下不属于面向对象程序设计语言的是 A C B Python C Java D C 2 以下奖项与计算机领域最相关的是 A 奥斯卡奖 B 图灵奖 C 诺贝尔奖 D 普利策奖 3 目前主流的计算机储存数据最终都是转换成 数据进
  • CSS的clip-path属性使用

    前言 clip path CSS 属性使用裁剪方式创建元素的可显示区域 区域内的部分显示 区域外的隐藏 基本语法 clip path clip source basic shape geometry box none 属性说明 clip s
  • iterm2跳板机自动登录脚本

    前言 现在要想访问公司服务器都必须通过跳板机再跳到目标服务器 这么做是运维人员为了安全性考虑和可以高效管理公司庞大的服务器集群 但是我们都知道安全性提高后必定降低我们日常工作的效率 必须先登录到跳板机 再选目标服务器 每次访问服务器都增加了
  • 前端面试题-url、href、src

    一 URL的概念 统一资源定位符 或称统一资源定位器 定位地址 URL地址等 英语 Uniform Resource Locator 常缩写为URL 有时也被俗称为 网页地址 网址 如同在网络上的门牌 是因特网上标准的资源的地址 Addre
  • Python模块学习 ---- atexit

    atexit模块很简单 只定义了一个register函数用于注册程序退出时的回调函数 我们可以在这个回调函数中做一些资源清理的操作 注 如果程序是非正常crash 或者通过os exit 退出 注册的回调函数将不会被调用 我们也可以通过sy
  • 一篇文章让你搞定所有redis面试题

    Redis是什么 Redis是C语言开发的一个开源的 遵从BSD协议 高性能键值对 key value 的内存数据库 可以用作数据库 缓存 消息中间件等 它是一种NoSQL not only sql 泛指非关系型数据库 的数据库 redis
  • Arduino酸度计(PH计)

    在本项目中 我们将通过将模拟pH传感器与Arduino接口来设计pH计 介绍 在化学中 pH是用于指定水基溶液的酸性或碱性的标度 酸性溶液的pH值较低 而碱性溶液的pH值较高 因此 Ph传感器具有确定任何溶液的Ph的能力 即可以判断该物质本
  • JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class

    我们在部署代码时 明明类存在 但是发现报错 NoClassDefFoundError Could not initialize class 这类问题是由静态成员或静态初始化语句块引起 我们先看下面个类 import org apache c
  • C语言实现MD5/SHA1/SHA256/SHA512

    哈希函数是我们做校验时经常会用到的密码学工具 目前常用的工具有MD5 SHA1 SHA256 SHA512等 其中MD5已经被证实不安全 目前只能作为一种辅助的校验手段 而不能防篡改 下面介绍如何使用mbedTLS协议栈中的hash代码生成
  • BGP属性

    BGP 外部网关协议 此协议不在于自动发现网络拓扑 不追求速度 而在于AS之间选择最佳路由和控制路由的传播 追求可靠性 稳定性 操控性 承载性 使用TCP作为其传输协议 监听端口号为179 保证其可靠性 路由更新只发送更新的路由 适用于在以
  • C++基础学习笔记——对象的定义及引用

    1 类与对象的关系 通常我们把具有同样性质和功能的东西所构成的集合称为类 在C 中 可以把相同内部存储结构和相同操作集的对象看成属于同一类 在C 中 对象是类的实际变量 类与对象间的关系 可以用整型 int 和整型变量 i 之间的关系来类比