C++之关键字class整理

Jetson Orin Nano GPIO 实战,用 devmem 玩转 Pinmux 引脚复用配置 devmem 是一个直接读写寄存器的工具,通过 mmap 将 /dev/mem 中的物理地址区域映射到用户空间进程地址空间,从而实现直接读写,正常情况下在 /dev 下可以看到 mem。可以看到对应 bit5 bit6 分别为 1,对应配置为 E_IO_HV 为 ENABLE 以及 E_INPUT 为 ENABLE。需要 TRM 手册查看相关寄存器,以及安装 busybox,busybox 内置了 devmem。根据 TRM 手册,找到 I2C_SDA 的 pinmux 地址偏移是 0x18。 阅读详情
AI摘要

本文详细介绍了C++中class关键字的定义、特性、成员函数、继承和友元等核心概念。通过访问控制符、封装、继承和多态等特性,class实现了数据和函数的封装,提高了代码的模块化、可重用性和安全性。文章还探讨了构造函数、析构函数、inline关键字、虚函数、重载、static成员以及this指针的使用,最后对继承和友元进行了阐述。

在C++中,class是一种用户自定义的数据类型,并且可以将数据和函数捆绑在一起,形成一个逻辑实体。class是C++面向对象编程(OOP)的基础,提供了将数据和函数捆绑的方式,让代码更加的模块化、提升了代码的可重用性和易读性。

一、C++ class的定义

class是C++中一个重要的关键字,用它来定义类型,其形式如下:

class ClassName{
public:
// 公共的行为和属性
protected:
// 被保护的行为和属性
private:
// 私有的行为和属性
};

1.1 访问控制

class可以通过访问控制符来限制对成员的访问;C++提供了三种控制级别:public、protected和private。默认情况下,class的成员是私有的,只允许类内部的成员函数(和友元类/函数)访问,但是可以通过使用访问控制符来进行控制调整。

1.2 class的三大特性

C++的class有三大特性:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
封装: class支持封装,意思就是可以藏逻辑的细节,只提供必要的接口(API)给外部调用。通过将数据私有化并提供公有的访问函数,class通过控制数据的访问操作,从而提高数据安全性。
继承: class可以通过继承来生成新的类(即派生类)。子类(派生类)可以继承父类(基类)的成员(包括数据成员和成员函数),并且可以添加新的成员或覆盖父类的成员。
多态: class的多态性是指允许使用基类的指针或引用来指向派生类的对象,并且可以再运行时动态绑定到正确的函数。多态性是通过虚函数或纯虚函数来(即关键字virtual修饰的函数)实现的。

1.3 成员函数

class可以包含成员函数(即方法或操作),用于处理内部的成员数据。这些成员函数可以访问和修改对象内部的数据,从而执行特定的操作。

1.3.1 构造和析构函数

class中的构造函数和析构函数,用于类对象的初始化和销毁。构造函数在创建对象时被调用,而析构函数则是在对象销毁时被调用,用来释放资源等销毁操作。

class TestClass{
public:
	// 构造函数
	TestClass();
	// 析构函数
	~TestClass();
};

何时使用关键字 explicit ?
explicit可以修饰只有一个参数的构造函数,或者有默认参数的多参数构造函数。当构造函数被explicit修饰后,该构造函数只能显式调用,不能用于隐式类型转换。例如:

class TestClass{
public:
	explicit TestClass(int value){}
	// 或者
	explicit TestClass(int value, int value2 = 0,...){}
	// 或者
	explicit TestClass(int value = 1,...){}
};

int main(){
	TestClass obj = 1; // 错误,不能隐式转换
	TestClass obj2(2); // 正确,显式调用
}

explicit的作用和重要性:

  1. 防止隐式类型转换: explicit关键字可以防止编译器自动将一个类型转换为另一个类型,从而避免潜在的错误和精度丢失。
  2. 提高代码的可读性: 通过明确指定类型转换,可以使代码更加清晰易懂,减少因隐式转换导致的错误。
  3. 避免意外结果: 隐式转换可能会导致意外的结果,使用explicit可以避免这种情况,确保代码能按预期运行。
1.3.2 关键字inline

inline作为C++中的关键字,在函数声明或定义中,在函数返类型前加上关键字inline(这样可以把函数指定为内联函数)。关键字inline的作用主要是用来解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。需要注意的是,被inline修饰的函数的逻辑不能太复杂,做好不要超过10行代码,不包含循环语句等。

class TestClass{
public:
	inline int add (int a, int b){
		return a + b;
	}
};
1.3.3 虚函数与纯虚函数
1.3.4 重载

重载是在同一个作用域(同一个类内)内存在多个同名函数或操作符的能力,只要它们的参数类型或参数个数不同即可,可以执行多种类型的操作。


class TestClass{
public:
	TestClass(double r = 0.f, double i = 0.f):
		real(r),
		imag(i){

	}

	// 函数重载
	void display(int a){
		std::cout << "Display int: " << a << std::endl;
	}

	// 函数重载
	void display(std::string& a){
		std::cout << "Diaplay string: " << a << std::endl;
	}
	
	// 运算符重载
	TestClass operator+(const TestClass &b){
		TestClass tmp;
		tmp.real = this->real + b.real;
		tmp.imag = this->imag + b.imag;
		return tmp
	}
private:
	double real, imag;
};

需要注意:

  • 参数类型和数量:这是区分重载函数的关键。参数顺序、类型或数量必须不同;
  • 返回类型:仅当参数列表不同时,返回类型不影响重载决议。
  • 友元函数:如果操作符重载需要访问lei的私有成员,通常定位为友元函数。
  • 构造函数重载:类可以有多个构造函数,只要它们的参数列表不同。这是构造函数重载的一个常见用法。
  • 模板和重载:可以将模板和重载结合,创建灵活的通用代码。例如,使用模板函数来处理不同类型的数组元素。
1.3.5 static

在类的内部声明静态函数时,需要用关键字static修饰,但是在类外部定义函数时就不需要了。因为static成员是类的组成部分但不是任何对象的组成部分,所以有以下几个特点:

  1. static函数没有this指针;
  2. static函数不能被声明为const(将成员函数声明为const就是chengnuo不会修改该函数所属的对象);
  3. static成员函数也不能被声明为虚函数。
// .hpp头文件
class TestClass{
public:
	TestClass();
	static int add(int value);
private:
	static int v;
};

// .cpp 源文件
int TestClass::add(int value){
	return TestClass::v + add;
}

1.4 成员变量

class中包含各种数据成员,也可称为类的属性或字段,它们主要用于存储类的属性或状态。它们的数据类型有浮点型、整型、bool型等。

1.4.1 static

static数据成员可以声明为任意类型,可以是常量、引用、数组、类类型等等。
static数据成员必须在类定义的外部定义,并且在定义时进行初始化。
定义该数据成员时,它的定义是在源文件中:

// .hpp 头文件
class TestClass{
public:
	TestClass(){}
private:
	static int value;
	// 特殊的静态常量整型成员
	static const int value2 = 5;
};

// .cpp 源文件
int TestClass::value = 10;

1.5 this指针

在成员函数中有一个附加的隐含形参(即this指针),它由编译器隐含的定义。同时成员函数可以显式使用this指针。

class TestClass{
...
public:
	TestClass(){}
	TestClass& get(){ return *this; }
};

二、继承

继承(inheritance )是面向对象程序设计中代码重复使用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加类型的功能,新生成的类被称为派生类(或子类)。利用继承这一特性,可以体现出面向对象设计的层次结构,体现了从简单到复杂的认知过程。

class Person{
public:
	string name;
	int age;
};

class Student: public Person{
public:
	int _major;
	int _id;
};

“Student“是派生类的名称
“:”表示要继承
“public”表示继承的方式,继承的方式有public、protected、private三种方式
“Person”是基类

继承方式和访问限定符的关系,如下表所示:

类成员/继承方式publicprotectedprivate
public成员publicprotectedprivate
protected成员protectedprotectedprivate
private成员不可见不可见不可见

总结:

  1. 基类中的private成员,虽然也被派生类继承,但是在派生类中是不可见的(即不能去访问)。
  2. 继承时,若不指定继承方式,class默认的继承方式为private,而struct默认的继承方式为public。
  3. 继承的权限排序:public>protected>private。

三、友元

友元,它是允许一个类将其非公有成员的访问权限授予指定的函数或类;不过友元破坏了class的封装性。友元有两种即友元类和友元函数;友元可以卸载class内的任何位置,建议将友元的声明放在类定义的开始或结尾。

关键字friend就是用来声明友元函数的。

class FirendTestClass{
public:
	void test(int value);
};
void test(int value);

class TestClass{
public:
	// 友元类
	friend class FirendTestClass;
	// 友元函数
	frient void FirendTestClass::test(int value);
	frient void test(int value);
};

需要注意的:
1. 友元是单向性的;
2. 友元不具备继承性。

扩展

  1. 一个空类的size为1。
class EmptyClass{
};
std::cout << sizeof(EmptyClass) << std::endl;
机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下) 摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。 阅读详情

相关推荐

Win10文件夹只读属性自动恢复?彻底解决方法解析

Win10文件夹只读属性自动恢复?彻底解决方法解析在Windows系统使用过程中,文件权限管理常会遇到棘手问题。最近多位用户反馈:取消文件夹只读属性后,系统却自动恢复该设置,导致无法正常复制或修改文件。本文将深入分析该现象的产生原因,并提供多种解决方案,帮助开发者彻底摆脱权限困扰。

mmoo_python的博客 7521

C++类(Class)总结

一直研究算法,基于matlab/python的机器学习和深度学习,也写了几篇专利,但是在终端产品的DSP上应用始终是短板, c/c++一直是拦路虎,决定补起来

梅逊雪——记录科学研究 4万+

如何实现MCGS与S7-200SMART PLC以太网多台通信控制?

第九步:(设备工具箱—设备管理—鼠标依次点击通用TCP/IP父设备—西门子_ Smart200到设备窗口里面去)数据类型:第0位(指PLC地址变量小数点后面的位数,例如我地址是M0.0,那么在数据类型应填写通道的第00位)第十步:(鼠标双击打开通用TCPIP父设备0--[通用TCP/IP父设备]进入通信配置)通道地址:0(指小数点前面起始字节的地址,例如我地址是M0.0,那么应在通道地填写0)。第七步:(选择通用TCP/IP父设备,点击新增,右侧选定设备就会自动添加进去。

u010670857的博客 6716

C++class类的详解

使用 new 创建的对象,在不需要使用的情况下需要我们手动使用 delete 删除释放该对象占用的内存,没有使用 new 创建的对象在不使用的情况下系统会自动回收被占用的内存。如果创建对象需要使用的内存较多,则需要使用 new 来动态分配内存,创建对象只需要消耗的内存不多则可以直接分配内存。类的构造和析构函数如果没有定义的话,编译器会给类定义默认public权限的无参的构造和析构函数。在C++中,类的默认访问权限是private,结构体的默认访问权限是public。当存在无参构造时,a后面的()可以省略。

qq_53511990的博客 1万+

物体检测之非极大值抑制:NMS、softNMS、softerNMS、IoU-Net

当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用NMS过滤掉重叠的候选框,得到最佳的预测输出。当前有如下几种较为常见的NMS方法, 1.基本NMS 非极大值抑制, 顾名思义就是抑制不是极大值的边框,这里的抑制通常是直接去掉冗余的边框。 这个过程涉及以下两个量化指标: 1.预测得分:NMS假设一个边框的预测得分越高,这个框...

LeoLee 1941

Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决

在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。想要在Windows上安装Docker(实际上是基于Hyper-V或者WSL2这两项虚拟化技术),需要开启虚拟化功能,所以不管是对于系统还是硬件都有一定的要求。

sym的博客 9782

C++关键字之——class

C++关键字之——class

StephenRay的博客 4501

Redis+QMT实战:如何用Stream模式实现聚宽策略的毫秒级跟单(附完整代码)

本文详细介绍了如何利用Redis Stream模式构建一个低延迟、高可靠的量化交易信号中继系统,实现从聚宽策略到本地QMT的毫秒级跟单。通过对比传统方案,解析了Redis Stream在消息持久化、消费组和显式确认方面的核心优势,并提供了完整的架构设计思路与核心代码实现,帮助量化开发者解决云端策略信号稳定传递至本地实盘的难题。

weixin_29280657的博客 477

C++类(Class)的定义与实现

转载自:http://www.cnblogs.com/mr-wid/archive/2013/02/18/2916309.html(但是他的内容中有一些错误) 一、"类" 的介绍     在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象",

Rain 4万+

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4

Orcad的学习记录

qq_31444421的博客 1万+

阿里天池新闻推荐实战:多路召回策略解析与优化

本文深入解析阿里天池新闻推荐项目中的多路召回策略,包括ItemCF、UserCF、YouTubeDNN等五种召回模型的协同应用与优化技巧。通过实战案例展示如何提升推荐系统效果,特别针对冷启动问题提出创新解决方案,帮助开发者构建高效的新闻推荐系统。

weixin_26918763的博客 415

完整C++关键字列表(字母顺序)

【代码】完整C++关键字列表(字母顺序)

qq_38053711的博客 175

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 650

C++ 面试常见问题(C++基础)

在网络传输中,通常使用大端字节序(网络字节序)。在具体的操作系统中,字节序取决于底层硬件架构。例如,Linux和Windows操作系统主要运行在x86和x86_64(Intel和AMD处理器)架构上,这些处理器使用小端字节序。而其他硬件平台,如PowerPC和SPARC等,可能使用大端字节序。宏定义(#define)和内联函数(inline)都是为了减少函数调用开销和提高代码运行效率而引入的机制,但是它们的实现方式和作用机制略有不同。

qq_45566676的博客 324

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ffmpeg通过CMake集成到Android遇到的问题整理

在Android里面集成ffmpeg使用的时候,遇到了很多问题,这里整理一下。 1.invalid suffix on literal; C++11 requires a space between literal and identifier C++需要再字符和变量之间增加空格号 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout); 需改为 snprintf(name, sizeof(name), "0x%" PRIx64, ch_layo

laibowon的专栏 842

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++】初入嵌入式C++复习-----经典面试题100道

自我整理c++面试题100道,用于日常复习和面试准备。希望对于到家有用!

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 2894

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++ 中 template<class T>和template<typename T>的区别

C++ 中 template和template的区别

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3358

Essential C++学习记录&笔记整理26(打造一个Iterator Class)

打造一个Iterator Class 这一节讲了运算符重载的相关知识,以及嵌套类型(typedef) 运算符重载 泛型指针类的运算,肯定不能用正常的内置类型的那种运算符。为什么?这是规定!此时我就需要运算符重载,怎么运算符重载呢? 运算符重载,说白了就是我重新定义原有的运算符以适合泛型指针类的运算。我可以像定义成员函数那样重新定义运算符。 运算符函数很像普通函数,但是运算符函数不用指定函数名。只需要在运算符前加上关键字operator即可,如: class Triangular_iterator {

Bqv它不想做功的博客 658

C++教程之auto关键字的使用

一、auto关键字的前世 从C语言开始,auto关键字就被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。 #include int main() { int a = 123; auto int b = 234; auto c = 345; printf("a = %

戴维营教育 3597

20【c++入门】class类整理

大纲 1.类 2.类的定义 3.类的实现 4.类的使用 1.类 在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。 类是属于...

1 396

C++基础整理(9)之强枚举类,enum class的意义

C++强枚举、enum class

ULTRAmanTAROACE的博客 2177

c++中Struct 与 Class的区别

讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么?? --------------------------------------------------------------- 问的人太多,干脆整理个FAQ吧。 首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同

ligangok的专栏 973

C++ class和struct区别整理

1、访问控制:class成员默认权限是private的,而struct成员默认权限是public;class默认继承方式是私有的继承,而struct默认是公有继承。这就是为什么我们在使用class继承的时候要表明public继承的原因。 2、到底默认是public继承还是private继承,关键看子类而不是基类,即struct可以继承class,class也可以继承struct,默认的访

ccnnli的博客 460

C++中struct和class的区别

讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??  ---------------------------------------------------------------  问的人太

Rachel Zhang的专栏 2797

C++ 整理

C++一直在用,但是类中有很多知识一直没怎么用到,如今秋招在即,抽时间整理一下吧~ https://www.cnblogs.com/yasanlun/p/3838531.html 目录 1、C++特点 1.1 class和struct C++的 class和struct的区别 c语言中的struct 和 c++ 的struct的区别 1.2 友元函数: 1.3 重载 1.4 类...

Musing的博客 1839

Java之Java关键字及其作用,Java面试题大全(整理版)

abstract关键字可以修改类或方法。abstract类可以扩展(增加子类),但不能直接实例化。abstract方法不在声明它的类中实现,但必须在某个子类中重写。采用abstract方法的类本来就是抽象类,并且必须声明为abstract。abstract类不能实例化。仅当abstract类的子类实现其超类的所有abstract方法时,才能实例化abstract类的子类。这种类称为具体类,以区别于abstract类。

m0_58269520的博客 1155
上一篇: C++之无锁编程
一杯盐水
博客等级 码龄10年 62粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值