【C++】探索C++中的类与对象(下)---深入理解C++中的关键概念与应用

​​在这里插入图片描述

🌱博客主页:青竹雾色间.
😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注
在这里插入图片描述
✨人生如寄,多忧何为 ✨


在C++编程中,有许多重要的概念和特性,包括构造函数、explicit关键字、静态成员、友元以及内部类。这些概念不仅仅是语言的一部分,更是设计和理解类和对象之间关系的关键。在本文中,我们将深入探讨这些概念,并通过一系列具体的代码示例来加深理解。


文章目录

  • 一.构造函数
  • 二.explicit关键字
  • 三. 静态成员
  • 四.友元
  • 五.内部类

一.构造函数

  • 构造函数负责初始化对象的各个成员变量。
    • 可以通过构造函数体赋值,也可以使用初始化列表进行初始化。
    • 使用初始化列表进行初始化更为高效,尤其是对于引用成员、const成员以及自定义类型成员等情况。
//构造函数体赋值
class Date{public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;};//初始化列表class Date{public:
Date(int year, int month, int day)
//每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次): _year(year),  _month(month), _day(day){}private://成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关int _year;int _month;int _day;};int main(){
// 对于自定义类型成员变量,一定会先使用初始化列表初始化Date d(1);}

二.explicit关键字

explicit关键字用于修饰构造函数,可以防止隐式类型转换,避免意外的行为发生。这对于构造函数只接受一个参数的情况尤其重要。

#include <iostream>class MyClass {
private:int value;
public:// 构造函数explicit MyClass(int v) : value(v) {}int getValue() const { return value; }
};void printValue(const MyClass& obj) {std::cout << "Value: " << obj.getValue() << std::endl;
}int main() {MyClass obj(5);printValue(obj);  // 正常,显式调用printValue函数// 下面的代码会报错,因为explicit关键字禁止隐式类型转换// printValue(10);  // 错误,不能将int隐式转换为MyClassreturn 0;
}

三. 静态成员

静态成员是属于类的成员,而不是属于类的对象。

  • 静态成员变量被所有类对象共享,不属于某个具体的对象,存储在静态区;成员变量属于每一个类,存储在对象里面。
  • 静态成员变量必须在类外部初始化(定义时不添加static关键字,类中只是声明),并可以通过类名或对象来访问。
  • 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  • 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  • 静态成员也是类的成员,受public、protected、private 访问限定符的限制
#include <iostream>class Counter {
private:static int count; // 静态成员变量
public:Counter() { count++; }static int getCount() { return count; }
};int Counter::count = 0; // 初始化静态成员变量int main() {Counter c1;Counter c2;std::cout << "Counter count: " << Counter::getCount() << std::endl; // 2return 0;
}

四.友元

友元提供了一种突破封装的方式,允许特定函数或类访问另一个类的私有成员。友元可以是函数或类,分别用于解决函数访问私有成员和类访问私有成员的情况。

#include <iostream>class A {
private:int x;friend class B; // 声明B为友元类
public:A() : x(0) {}
};class B {
public:void modifyA(A& obj, int val) {obj.x = val; // B可以访问A的私有成员x}
};int main() {A a;B b;b.modifyA(a, 10);return 0;
}

五.内部类

概念:
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意:
内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。
#include <iostream>class Outer {
private:int x;
public:Outer(int value) : x(value) {}class Inner {public:void display(Outer& obj) {std::cout << "Value of x in Outer: " << obj.x << std::endl;}};
};int main() {Outer o(5);Outer::Inner i;i.display(o); // 通过内部类访问外部类的成员xreturn 0;
}

通过以上示例,我们深入理解了C++中关键概念的使用方法,并通过代码演示了它们的功能和作用。对于C++程序员来说,掌握这些概念是设计和编写高质量代码的关键步骤。
在这里插入图片描述

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

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

相关文章

【黑马头条】-day05延迟队列文章发布审核-Redis-zSet实现延迟队列-Feign远程调用

文章目录 昨日回顾今日内容1 延迟任务1.1 概述1.2 技术对比1.2.1 DelayQueue1.2.2 RabbitMQ1.2.3 Redis实现1.2.4 总结 2 redis实现延迟任务2.0 实现思路2.1 思考2.2 初步配置实现2.2.1 导入heima-leadnews-schedule模块2.2.2 在Nacos注册配置管理leadnews-schedule2.2.3 导入表…

【Leetcode】1. 两数之和

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给定一个整数数组 n u m s nums nums 和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出 和为目标值 t a r g e t target target 的那 两个 整数&…

序列超图的下一项推荐 笔记

1 Title Next-item Recommendation with Sequential Hypergraphs&#xff08;Jianling Wang、Kaize Ding、Liangjie Hong、Huan Liu、James Caverlee&#xff09;【SIGIR 2020】 2 Conclusion This study explores the dynamic meaning of items in realworld scenarios and p…

JAVA IO流学习

File类&#xff1a; File类是java.io包中很重要的一个类 File类的对象可以代表一个文件或者目录&#xff0c;可以修改文件大小、文件最后修改日期、文件名等 File对象不能操作文件的具体数据&#xff0c;即不能对文件进行读和写的操作 File的构造方法&#xff1a; File&…

并查集学习(836. 合并集合 + 837. 连通块中点的数量)

//得先加集合个数再合并&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 核心代码&#xff1a; int find(int x){//返回父节点if(x ! p[x]) {p[x] find(p[x]);//路径压缩 } //孩子不等于爸爸&#xff0c;就…

Pytorch转onnx

pytorch 转 onnx 模型需要函数 torch.onnx.export。 def export(model: Union[torch.nn.Module, torch.jit.ScriptModule, torch.jit.ScriptFunction],args: Union[Tuple[Any, ...], torch.Tensor],f: Union[str, io.BytesIO],export_params: bool True,verbose: bool False…

【QT+QGIS跨平台编译】056:【pdal_json_schema+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_json_schema介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_json_schema介绍 pdal_json_schema 是与 PDAL(Point Data Abstraction Library)相关的 JSON 模式文件。PDAL 是一个用于处理和分析点云数据的开源库。JSON 模式…

DHCP-PXE

Dynamic Host Configuration Protocol 动态主机配置协议 1.Selinux 调试为Permission 防火墙配置 搭建DHCP的主机必须有一个静态地址&#xff0c;提前配置好 安装DHCP软件 服务名为dhcpd DHCP地址分配四次会话&#xff0c; DISCOVERY发现 OFFER 提供 REQUEST 回应 A…

5G网络架构及技术(二):OFDM一

ToDo: 等把这些讲义看完后得单开一个文章整理思维导图   该部分由于内容比较重要&#xff0c;OFDM是5G物理层的基础&#xff0c;但学习时直接跳到5G OFDM去看它的那些参数设置感觉没什么意义&#xff0c;还得从发展的角度进行学习&#xff0c;先从最先用到OFDM的WiFi协议开始…

WCH恒沁单片机-CH32V307学习记录2----FreeRTOS移植

RISC-V 单片机 FreeRTOS 移植 前面用了 5 篇博客详细介绍了 FreeRTOS 在 ARM Cortex-M3 MCU 上是如何运行的。 FreeRTOS从代码层面进行原理分析系列 现在我直接用之前的 RISC-V MCU 开发板子&#xff08;CH32V307VCT6&#xff09;再次对 FreeRTOS 进行移植&#xff0c;其实也…

【C语言自定义类型之----结构体,联合体和枚举】

一.结构体 1.结构体类型的声明 srruct tag {nemer-list;//成员列表 }varible-list;//变量列表结构体在声明的时候&#xff0c;可以不完全声明。 例如&#xff1a;描述一个学生 struct stu {char name[20];//名字int age;//年龄char sex[20];//性别 };//分号不能省略2.结构体…

C语言实现快速排序算法

1. 什么是快速排序算法 快速排序的核心思想是通过分治法&#xff08;Divide and Conquer&#xff09;来实现排序。 算法的基本步骤是: 1. 选择一个基准值&#xff08;通常是数组中的某个元素&#xff09;&#xff0c;将数组分成两部分&#xff0c;使得左边的部分所有元素都小于…