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

        在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类的指针变量pp = &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指向对象sStudent &s2 = s;// 调用成员s2.set_value();s2.display();
}

5、三种方法区别

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯真题:单词分析

import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main{public static void main(String[]args) {Scanner sannernew Scanner(System.in);String strsanner.nextLine();int []anew int [26];for(int i0;i<str.length();i) {a[str.charA…

4.2 c++

#include <iostream>using namespace std; int Max10; class Stack { public:int* base;//栈底&#xff1b;int* top;//栈顶&#xff1b;void creat(Stack& s);//初始化顺序栈void in(Stack& s);//入栈void out(Stack& s);//出栈void empty(Stack& s);//…

Ps:颜色查找

颜色查找 Color Lookup命令通过应用预设的 LUT 来改变图像的色彩和调性&#xff0c;从而为摄影师和设计师提供了一种快速实现复杂色彩调整的方法&#xff0c;广泛应用于颜色分级、视觉风格的统一和创意色彩效果的制作。 Ps菜单&#xff1a;图像/调整/颜色查找 Adjustments/Colo…

栈溢出攻击的软硬件缓解技术

为了防范栈溢出攻击&#xff0c;现代处理器架构&#xff08;如Arm架构&#xff09;具有执行权限。在Armv8-A中&#xff0c;主要的控制是在MMU地址转换表&#xff08;translation tables&#xff09;中的执行权限位。 UXN User (EL0) Execute-never …

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

Hive on Spark 配置

目录 1 Hive 引擎简介2 Hive on Spark 配置2.1 在 Hive 所在节点部署 Spark2.2 在hive中创建spark配置文件2.3 向 HDFS上传Spark纯净版 jar 包2.4 修改hive-site.xml文件2.5 Hive on Spark测试2.6 报错 1 Hive 引擎简介 Hive引擎包括&#xff1a;MR&#xff08;默认&#xff09…

js使用canvas实现画roi功能,并实现交集并集差集操作,附源码

效果概览 支持圆形,矩形,旋转矩形绘制,鼠标像素拾取,图片缩放,图片拖拽,像素测量,roi交集并集补集输出 TODO:实现自由路径绘制,与后台交互数据 实现原理 交集并集差集使用像素做运算,使用0代表没有像素,1代表有像素,然后再做运算 // 计算交集calculateIntersec…

腾讯电商再度回归!视频号小店成为今年最强黑马?

大家好&#xff0c;我是电商小布。 现在在电商的这个圈子里&#xff0c;视频号这个项目&#xff0c;也是常常被大家提起。 特别是在新型电商玩法的发展下&#xff0c;传统电商已经不足以满足客户的需求&#xff0c;搞流量才是重点。 而在这其中&#xff0c;抖音、视频号这两…

Flume学习笔记

视频地址:https://www.bilibili.com/video/BV1wf4y1G7EQ/ 定义 Flume是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。 Flume高最要的作用就是实时读取服务器本地磁盘的数据,将数据写入HDFS。 官网:https://flume.apache.org/releases/content/1.9.0/…

TikTok账号被封是为什么?如何解决?

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…

鸿蒙原生应用开发-网络管理Socket连接(一)

一、简介 Socket连接主要是通过Socket进行数据传输&#xff0c;支持TCP/UDP/TLS协议。 二、基本概念 Socket&#xff1a;套接字&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 TCP&#xff1a;传输控制协议(Transmission Control Protocol)。是一…

回文数的判断

算法思想&#xff1a;代码是将字符串全部入栈&#xff0c;然后扫描字符串进行比较&#xff0c;直到扫描到字符串尾部&#xff0c;该算法需要两次扫描字符串&#xff0c;效率不高。 可以改进代码&#xff0c;只将字符串的前半部分入栈&#xff0c;然后前半部分出栈与字符串后半…