C++ 类和对象 终篇

一 static成员:

静态成员变量是属于整个类的,而不是某个特定对象的。也就是说,所有对象共享同一个静态成员变量。它的特点包括:

非静态成员变量:

class A 
{
public:int _x; // 非静态成员变量
};int main() 
{A a1, a2;a1._x = 5;a2._x = 10;std::cout << a1._x << std::endl; // 输出 5std::cout << a2._x << std::endl; // 输出 10return 0;
}

在这个例子中,a1a2 是两个不同的对象,它们各自有自己的 _x 变量,互不影响。a1._x 的值是 5,而 a2._x 的值是 10。

 静态成员变量:

class A 
{
public:static int _x; // 静态成员变量
};// 在类外定义并初始化静态成员变量
int A::x = 0;int main() 
{A a1, a2;a1._x = 5;std::cout << "a1._x: " << a1._x << std::endl; // 输出 5std::cout << "a2._x: " << a2._x << std::endl; // 输出 5a2._x = 10;std::cout << "a1._x: " << a1._x << std::endl; // 输出 10std::cout << "a2._x: " << a2.x << std::endl; // 输出 10return 0;
}

在这个例子中,x 是静态成员变量,它属于类 A,而不属于任何特定的对象。我们在类外定义并初始化了 A::x

总结:

共享性:静态成员变量在所有对象间共享,同一个类的所有实例都可以访问同一个静态成员变量。

类外初始化:静态成员变量必须在类外进行定义和初始化,确保它们只初始化一次

静态成员函数:

特点:

没有 this 指针:静态成员函数不能访问类的非静态成员变量或成员函数,因为不属于任何特定的对象所以它们没有隐含的 this 指针。

类范围内的函数:静态成员函数属于类的范围,可以在没有对象实例的情况下调用,直接通过类名调用。

访问静态成员变量:静态成员函数可以访问静态成员变量,因为它们同样属于类范围内。

代码演示:

class A 
{
public:A() {++n;}A(const A& a) {++n;}static int Getn() {return n;}private:static int n;
};// 在类外定义并初始化静态成员变量
int A::n = 0;int main() 
{A aa1; A aa2;cout << A::Getn() << endl;return 0;
}

二 友元:

定义:

友元函数是一个定义在类外部的普通函数,但它被授予访问该类的私有和保护成员的特权。友元函数不是类的成员函数,但需要在类的内部声明,并使用 friend 关键字。

友元函数的特点:

  • 友元函数可以访问类的私有和受保护成员,但它本身并不是类的成员函数。

    • 友元函数在某种程度上是外部函数,但它们被赋予了访问指定类的私有和受保护成员的特权。
  • 友元函数不能被 const 修饰。

    • 尽管友元函数可以访问类的内部成员,但它们依旧是外部函数,因此不受类的成员函数的约束,如 const 限定。
  • 友元函数声明可以放在类的任何位置,不受访问控制符(如 publicprotectedprivate)的限制。

    • 无论是在 public 部分、protected 部分还是 private 部分,友元函数声明都可以放置,不影响其访问权限。
  • 一个友元函数可以是多个类的友元。

    • 这意味着同一个函数可以被多个类声明为友元,从而能够访问这些类的私有和受保护成员。
  • 友元函数的调用与普通函数相同。

    • 友元函数在调用时,不需要通过对象或类来调用,它们的调用方式与普通的非成员函数一致。

代码演示:

#include <iostream>
using namespace std;class Point
{
public:Point(){_x++;}// 友元函数声明friend ostream& operator<<(ostream& out, const Point& p);private:static int _x;
};// 初始化静态成员变量
int Point::_x = 0;// 友元函数定义
ostream& operator<<(ostream& out, const Point& p)
{out << Point::_x<<endl;return out;
}int main()
{Point a;cout << a << 3 <<endl; // 输出Point类的静态成员变量_x的值//cout << 3 << endl; // 输出3return 0;
}

友元类:

 定义:

友元类在C++中是一个用于控制访问权限的重要机制。它们允许一个类的所有成员函数访问另一个类的私有和受保护成员。

代码演示:

class Time
{friend class Date;  // Date 类是 Time 类的友元类public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问 Time 类的私有成员变量_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year;int _month;int _day;Time _t;  // Date 类中有一个 Time 对象
};

特点:

  • 友元关系是单向的

    • 友元关系是单向的。比如,Date 类可以访问 Time 类的私有成员,但 Time 类不能自动访问 Date 类的私有成员。如果需要 Time 类也能访问 Date 类的私有成员,你必须在 Time 类中声明 Date 类为友元类。
  • 友元关系不能传递

    • 友元关系是不可传递的。即使 CB 的友元,BA 的友元,这并不意味着 C 自动成为 A 的友元。每一个友元关系需要显式声明。
  • 友元关系不能继承

    • 友元关系不会继承。如果一个类 A 声明了 B 为友元类,那么子类 B 的所有派生类并不会自动成为 A 的友元类。友元关系仅对直接声明它们的类有效。

三 内部类:

定义:

内部类是定义在另一个类的内部的类。它可以访问外部类的所有成员,包括私有成员。

特点:

  • 内部类可以定义在外部类的 publicprotectedprivate 区域。
  • 内部类可以直接访问外部类的 static 成员,不需要外部类的对象或类名。
  • 内部类的存在对外部类的大小没有任何影响

代码演示:

#include <iostream>
using namespace std;class Product {
private:static int discount; // 静态成员变量,用于记录折扣int price;           // 非静态成员变量,记录价格public:class Details {public:void show(const Product& p) {cout << "Discount: " << discount << "%" << endl;  // 访问静态成员变量cout << "Price: $" << p.price << endl;            // 访问非静态成员变量}};// 构造函数Product(int p) : price(p) {}
};// 在类外定义并初始化静态成员变量
int Product::discount = 10;int main() {Product::Details d; // 创建嵌套类 Details 的对象Product p(100);     // 创建 Product 类的对象,价格为 100d.show(p);          // 调用 Details 类的成员函数,显示 Product 的信息return 0;
}

四 匿名对象:

定义:

匿名对象在C++中是指那些在创建时没有被赋予一个变量名的对象。它们的主要特点是生命周期非常短暂,只在创建它们的那条语句中存在,随后就会被销毁。匿名对象的使用场景通常是为了临时操作,比如传递对象作为函数参数或者调用成员函数。

代码演示:

#include <iostream>
using namespace std;class B
{
public:B(int b = 0): _b(b){cout << "B(int b)" << endl;}~B(){cout << "~B()" << endl;}void display() const{cout << "Value: " << _b << endl;}
private:int _b;
};int main()
{B(5).display(); // 创建一个匿名对象并调用其成员函数return 0;
}

让我们来主句分析:

  • B(5):

    • 这行代码创建了一个 B 类型的匿名对象。匿名对象意味着这个对象没有名字,也不会被存储在任何变量中。
    • 传递参数 5 给构造函数 B(int b),因此 _b 被初始化为 5
    • 构造函数 B(int b) 被调用,输出 "B(int b)"。
  • .display():

    • 匿名对象创建后,立即调用其成员函数 display()
    • display() 函数输出成员变量 _b 的值,即 "Value: 5"。
  • 对象销毁:

    • 由于匿名对象的生命周期仅限于该语句,在调用 display() 函数后,对象立即被销毁。
    • 析构函数 ~B() 被调用,输出 "~B()"。

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

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

相关文章

echarts使用案例

1.配置legend icon 根据点击事件动态更换样式 <template><div ref"chart" style"width: 600px; height: 400px;"></div></template><script>import * as echarts from echarts;export default {name: EchartsExample,data(…

C语言第三天笔记

变量 概念 表面&#xff1a;程序运行过程中取值可以改变的数据 实质&#xff1a;变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。 整个变量分为三部分&#xff1a; 变量名&#xff1a;这个只是变量的一个标识&#xff0c;我们借助变量名来存取数据。 变…

Element快速学习

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 什么是Element&#xff1f; Element&#xff1a;它是由饿了么团队开发的一个…

盛元广通实验室自动化生物样本库质量控制管理系统

随着我国生物医学研究的不断深入和精准医疗的快速发展&#xff0c;对高质量生物样本的需求日益增长。近年来&#xff0c;我国生物样本库建设取得了显著进展。各级政府、高校和医院纷纷投入资源建设生物样本库&#xff0c;推动了生物样本资源的有效整合和利用。生物样本库的质量…

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链&#xff0c;正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链&#xff0c;Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…

QEMU源码全解析 —— CPU虚拟化(11)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 《深度探索Linux系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社 特此致谢! 前边几回又再次讲了一下VMX,本回开始讲解VCPU…

aiohttp 异步爬虫实战

案例介绍 本次为我们要爬取一个数量相对大一点的网站&#xff0c; 链接为&#xff1a; https://spa5.scrape.center/ 这是一个图书网站&#xff0c;整个网站包含数千本图书信息&#xff0c;网站数据是 JavaScript 渲染而得&#xff0c;数据可以通过 Ajax 接口获取&#xff0…

vue3 使用Mock

官网: http://mockjs.com/ 安装 npm install mockjs -Dsteps1: main.js 文件引入 import /api/mock.jssteps2: src/api/mock.js import Mock from mockjs import homeApi from ./mockData/home /*** 1.拦截的路径:mock拦截了正常NetWork/网络请求,数据正常响应* 2.方法* …

乾坤: 微前端项目切换时样式闪动(从无样式变为正常样式需要等 css chunk 文件加载完成, 加载延时受网速影响)

背景: 点击基座项目页面左侧目录, 进入微前端子项目页面, 会有短暂的样式未加载效果一闪而过, 造成页面闪烁或更严重的其他样式错位问题 定位: 同事查了 qiankun git 项目的 issue: https://github.com/umijs/qiankun/issues/219 , 找到解决方案 解决: 项目 webpack 打包配…

【苍穹】完美解决由于nginx更换端口号导致无法使用Websocket

一、报错信息 进行到websocket开发的过程中&#xff0c;遇到了前端报错&#xff0c;无法连接的提示&#xff1a; 经过F12排查很明显是服务端和客户端并没有连接成功。这里就涉及到之前的坑&#xff0c;现在需要填上了。 二、报错原因和推导 应该还记得刚开苍穹的第一天配置前…

OWASP top 10之XSS和csrf

2021年top 10 A01&#xff1a;失效的访问控制&#xff08;越权漏洞&#xff09; XSS&#xff1a;Cross-Site Scripting 跨站脚本&#xff0c;在2021年top 10漏洞中被合并为注入类漏洞 属于&#xff1a;前端漏洞 分类&#xff1a;反射型、存储型、DOM型 反射型 将恶意js代…

什么是 Solidity

Solidity 是一种面向对象的用于编写智能合同的语言。 智能合同是存储在区块链中的程序。 它们指定有关数字资产传输的规则和行为。 可以使用 Solidity 为 Ethereum 区块链平台对智能合同进行编程。 智能合同包含状态和可编程逻辑。 智能合同通过事务执行函数。 因此&#xff0…

Python 中函数嵌套定义与调用

Python 中函数嵌套定义与调用 在 Python 中&#xff0c;函数可以在另一个函数内部定义和调用。这种技术称为嵌套函数。嵌套函数可以用来创建封装和作用域限制&#xff0c;帮助保持代码的组织性和模块化。 函数嵌套定义与调用 1. 函数嵌套定义 函数嵌套定义是指在一个函数内…

Java集合——Array、ArrayList、LinkedList

1. ArrayList和Array的区别 1. 大小和自动扩容 Array&#xff1a;创建时指定大小&#xff0c;大小固定。若数组被创建&#xff0c;其大小不能更改 ArrayList&#xff1a;动态数组实现&#xff0c;可以动态增长或缩小。在不断添加元素时&#xff0c;ArrayList会自动进行扩容 …

MySQL大框架总结

1.DDL,DML,DQL,DCL的区别 &#xff08;由于DCL是关乎用户的&#xff0c;以下内容重点讲述数据库&#xff0c;表与数据的操作&#xff0c;所以对DCL不详细赘述&#xff09; DDL DML DQL DCL 中文/英文 数据库定义语言 data definition language 数据库操作语言 data mani…

为什么多数大数据治理项目都是失败的?Gartner调查失败率超过90%

引言&#xff1a;随着数据规模的爆发式增长、数据价值的凸显以及数据治理的必要性。在政策的推动、市场需求的拉动以及技术进步的支撑下&#xff0c;大数据治理正成为推动企业数字化转型、提升数据价值的重要手段。企业希望通过大数据治理提升数据利用率和数据价值&#xff0c;…

深入理解Prompt工程

前言&#xff1a;因为大模型的流行&#xff0c;衍生出了一个小领域“Prompt工程”&#xff0c;不知道大家会不会跟小编一样&#xff0c;不就是写提示吗&#xff0c;这有什么难的&#xff0c;不过大家还是不要小瞧了Prompt工程&#xff0c;现在很多大模型把会“Prompt工程”作为…

19 Python常用内置函数——range()

range() 是 Python 开发中非常常用的一个内置函数。该函数返回具有惰性求值特点的 range 对象&#xff0c;其中包含左闭右开区间 [start, end) 内以 step 为步长的整数。 参数 start 默认为 0&#xff0c;step 默认为 1。 print(range(5)) print(list(range(5))) print(list(r…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

vue zip文件下载请求封装与使用

axios封装&#xff08;重点是响应拦截&#xff09; 这里把响应超时时间注释是文件下载接口返回需要较长时间 import axios from axios import {ElMessageBox} from "element-plus"; import router from "/router";const service axios.create({baseURL: …