C++面向对象程序设计 - 访问对象中成员的3种方法

news2024/12/23 16:42:47

        在C++程序中访问对象的成员变量和成员函数,有三种方法:

  1. 通过对象名和成员运算符访问对象中的成员;
  2. 通过指向对象的指针访问对象中的成员;
  3. 通过对象的引用变量访问对象中的成员

        在了解访问对象中成员的3种方法前,先了解下C++面向对象程序设计的特点。

1、struct和class区别

        C++增加了class类型后,扔保留了结构体类型(struct),而且把它的功能也扩展了。c++允许用struct业定义一个“类”类型。如果struct类体内没用private和public对其成员作显式声明,系统将全部成员默认为public(公用的),外界可以任意引用其中的数据成员和成员函数。代码如下:

#include <iostream>
#include <string>
using namespace std;

struct Student{
	int age;
	string name;
	string sex;
	// 显示学员信息
	void display(){
		cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex;
	}
};

int main(){
	Student s;
	s.age = 20;
	s.name = "Jack";
	s.sex = "male";
	s.display();
}

       运行结果如下:

        如果class类体内没有private和public对其成员作显示声明,系统将全部成员默认为private(私有的),外界不可以任意引用其中的数据成员和成员函数。

        所以如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。

2、类外定义成员函数

        在C++中,成员函数可以在类体内定义,也可以在类体外进行函数定义。在类体内定义函数时,不需要在函数名前加上类名,因为函数属于哪个类已不言而喻。但成员函数在类外定义时,必须在函数名前添加上类名,予以限制,“::”两个冒号作为作用域限定符,用它声明函数是属于类中的函数。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
		string get_name();
};

int main(){
	Student s;
	s.set_value();
	s.display();
	
	string student_name = s.get_name();
	cout <<"student name:" <<student_name <<endl;
}

string Student::get_name(){
	return name;
}

3、inline成员函数

        类的成员函数也可以指定为内置(inline)函数。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
};

int main(){
	Student s;
	s.set_value();
	s.display();
}

        其实void display()也可以写成inline void display(),将display()函数显示地声明为内置函数。不写也是等效的,在类体内定义的函数,一般都省写inline。

        但是如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
		inline string get_name();
};

int main(){
	Student s;
	s.set_value();
	s.display();
	
	string student_name = s.get_name();
	cout <<"student name:" <<student_name <<endl;
}

string Student::get_name(){
	return name;
}

4、访问对象中的成员

        在实际编程中,选择使用对象实例、指针对象还是引用变量,取决于你的具体需求和场景。

4.1、通过对象名访问成员

        对象实例是直接创建的对象。可以直接使用点“.”运算符来访问它的成员(成员变量和成员函数)。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
};

int main(){
	Student s;
	// 设置对象信息
	s.set_value();
	// 显示学员信息
	s.display();
}

        对象名和成员运算符访问对象中的成员,用点“.”(成员运算符)来对成员进行限定和调用,可以用"."调用对象中所有的公用成员。

4.2、通过对象的指针访问成员

        指针对象是一个指向对象的指针。你需要使用"->"运算符来访问它所指向的对象的成员。指针提供了更多的灵活性,比如动态内存分配和对象数组的操作。但使用指针时,需要格外小心内存泄漏和野指针等问题。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
};

int main(){
	Student s, *p;	//定义对象s和指向Student类的指针变量p
	p = &s;        // 使用p指向对象s
	// 调用成员
	p->set_value();
	p->display();
}

4.3、通过对象的引用访问成员

        引用变量是对象的别名。你可以像使用对象实例一样使用.运算符来访问它的成员。引用通常用于函数参数和返回值,以避免复制大型对象,提高效率。代码如下:

#include <iostream>
#include <string>
using namespace std;

class Student{
	private:
		int age;
		string name;
		string sex;
	public:
		// 定义内置函数
		inline void set_value(){
			cin >>name >>age >>sex;
		}
		// 显示成员信息
		void display(){
			cout <<endl;
			cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
		}
};

int main(){
	Student s;	//定义对象s
	// 引用变量s2指向对象s
	Student &s2 = s;
	// 调用成员
	s2.set_value();
	s2.display();
}

5、三种方法区别

        语法:对象实例和引用变量都是使用点"."运算符,指针对象对象使用"->"运算符。

        灵活性:指针对象提供了更多的动态性和灵活性,可以使用动态内存分配和复杂的数据结构。引用变量则更侧重于提供对象的别名,避免不必要的复制。

        安全性:使用指针时需要格外小心,因为不正确的使用可能导致内存泄露,野指针等问题。

        用途:对象实例通常用于简单的局部变量或对象创建。指针对象常用于动态内存管理、数组、键表等复杂数据结构。引用变量常用于函数参数和返回值,以提高效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 小程序和app map地图上显示多个酷炫动态的标点,头像后端传过来,真机测试有效

展示效果 二、引入地图 如果需要搜索需要去腾讯地图官网上看文档&#xff0c;找到对应的内容 1.申请开发者密钥&#xff08;key&#xff09;&#xff1a;申请密钥 2.开通webserviceAPI服务&#xff1a;控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebService…

LCD TP触摸屏调试方法

一、硬件连接 I2C总线&#xff1a;I2C-SDA和i2C-SCL 中断信号&#xff1a;touch-gpio 复位信号&#xff1a;reset-gpio 电源信号&#xff1a;power-gpio 二、驱动调试 2.1 确认从设备地址 在给TP供电正常后&#xff0c;检测其I2C设备从地址&#xff0c;或者通过datashee…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—天津大学专场

时间&#xff1a;2024年4月12日&#xff08;星期五&#xff09;14:00 地点&#xff1a;天津大学北洋园校区55楼B204 报名链接&#xff1a;https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业的数…

渗透测试:数据库UDF提权(linux)

目录 开头: 1.UDF提权简介&#xff1a; 1.1共享库文件(UDF文件)指定目录&#xff1a; 版本特征&#xff1a; 操作系统版本&#xff1a; 2.靶场UDF提权复现 提权前提 1.要有一个高权限的MySQL的账号 ​编辑 2.MySQL的权限配置secure_file_priv为空 3.必须有存放UDF文件的…

非关系型数据库——Redis配置与优化

目录 一、关系型数据库和非关系型数据库 1.定义 1.1关系型数据库 1.2非关系型数据库 2.非关系型数据库产生的背景 3.关系型数据库和非关系型数据库区别 3.1适用性不同 3.2数据一致性要求不同 3.3数据模型不同 3.4数据查询语言不同 3.5数据存储方式不同 3.6扩展方式…

【面试八股总结】超文本传输协议HTTP(二)

一、HTTP缓存技术 将资源&#xff08;如网页、图像、脚本等&#xff09;的副本存储在客户端或中间代理服务器上&#xff0c;以便将来的请求可以直接从缓存中获取&#xff0c;而不必重新从服务器下载资源。这有助于减少网络延迟&#xff0c;提高页面加载速度&#xff0c;并减轻…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…

行人重识别项目 | 基于Pytorch实现ReID行人重识别算法

项目应用场景 面向行人重识别场景&#xff0c;项目具有轻量化 (训练的时候也只需要 2GB 的显存占用)、性能好 (只使用 softmax 损失就能够达到 Rank188.24%, mAP70.68%)&#xff0c;另外提供友好的上手项目流程教程 项目效果&#xff1a; 项目流程 > 具体参见项目内README.…

穿山甲广告平台SDK接入效果怎么样?

广告收入是大多数开发者的应用变现收入来源&#xff0c;如何进行流流量变现是从应用设计之初就需要开发者思考的问题。 穿山甲广告平台作为国内第三方广告变现平台&#xff0c;是不少开发者选择的对接平台。 穿山甲广告平台的广告类型较多&#xff0c;有信息流&#xff0c;ba…

用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 &#xff08;一&#xff09;批量下载 PDF 文件 1.使用Selenium模块爬取多页内容 2.使用Selenium模块下载PDF文件 3.使用urllib模块来进行网页的下载和保存 4.使用urllib…

前端性能优化-Table渲染速度优化

教务系统-排课页面性能优化总结 一、前言 在公司教务系统中,排课页面慢的令人发指,在某些情况由于数据量大导致页面主进程卡死,遂组织进行一次排查优化,现记录一下 二、效果对比 以下数据均为UAT环境 Performence对比 更改前: 主进程渲染时间为 8s 教务系统-排课页面性…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

wps 开发插件

官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode&#xff0c;新建终端 安装…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

面试智力题

面试智力题 二进位bit1. 题目&#xff1a;一千杯水&#xff0c;一杯水有毒&#xff0c;怎么用10只老鼠&#xff0c;把这杯水找出来&#xff08;1&#xff09;解法1&#xff1a;常规法&#xff08;2&#xff09;bit法&#xff08;位数法&#xff09; (3) 时间法三级目录 二进位b…

Flutter Web 的未来,Wasm Native 即将到来

早在去年 Google I/O 发布 Flutter 3.10 的时候就提到过&#xff0c; Flutter Web 的未来会是 Wasm Native &#xff0c;当时 Flutter 团队就表示&#xff0c;Flutter Web 的定位不是设计为通用 Web 的框架&#xff0c;类似的 Web 框架现在有很多&#xff0c;而 Flutter 的定位…

Vision-Language Models for Vision Tasks: A Survey

论文地址&#xff1a;https://arxiv.org/pdf/2304.00685.pdf 项目地址&#xff1a;https://github.com/jingyi0000/VLM_survey 一、综述动机 视觉语言模型&#xff0c;如CLIP&#xff0c;以其独特的训练方式显著简化了视觉识别任务的流程。它减少了对大量精细标注数据的依赖&a…

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有&#xff1a; 文生图大模型&#xff1a;如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型&#xff1a;如CLIP、Chinese CLIP、…

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…