C++之关键字class整理

基于EtherCAT的AM402与SV660N、IS620N伺服运动控制实战指南 本文详细介绍了基于EtherCAT总线的汇川AM402 PLC与SV660N、IS620N伺服驱动器构建运动控制系统的完整实战流程。内容涵盖硬件平台搭建、软件组态、关键参数设置、InoProShop编程及调试技巧,旨在帮助工程师快速掌握这一高精度、高响应的工业自动化解决方案。 阅读详情
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;
51单片机也能玩转GC9A01彩屏?超详细移植指南与性能优化技巧 本文详细介绍了如何在51单片机上高效驱动GC9A01彩屏,包括硬件连接优化、SPI模拟驱动、内存管理策略及高级刷新技术。通过分段缓冲、颜色压缩和差异化刷新等技巧,显著提升显示性能,使51单片机也能流畅运行240x240分辨率的彩色TFT屏幕。 阅读详情

相关推荐

如何在STM32上5分钟搞定nanopb协议传输?附完整代码示例

本文提供了在STM32微控制器上快速集成nanopb协议传输的实战指南。通过详细的步骤,从.proto文件定义、代码生成到STM32CubeIDE项目移植,帮助开发者利用nanopb这一轻量级Protocol Buffers C语言实现,在5分钟内构建高效、跨平台的嵌入式设备通信框架,并附有完整的代码示例。

jwt8token的博客 839

C++类(Class)总结

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

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

「极简」扣子(coze)教程 | 细节决定成败!这个小功能让用户满意度飙升,讲的太细了

这一期大师兄通过向扣子(coze)应用添加提示语的方法向用户显示系统运行的状态。

u014527622的博客 2113

C++class类的详解

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

qq_53511990的博客 1万+

ANSYS材料库实战:手把手教你用APDL命令流定义混凝土和形状记忆合金

本文详细介绍了在ANSYS中使用APDL命令流定义混凝土和形状记忆合金(SMA)的高级建模技巧。通过SOLID65单元和SMA本构模型,工程师可以精确模拟非线性材料行为,包括混凝土的开裂和SMA的超弹性效应。文章提供了完整的命令流示例和求解策略优化建议,帮助用户提升工程仿真效率。

hh234的博客 486

ArcGIS拓扑检查实战:5分钟搞定面重叠与缝隙问题(附详细截图)

本文详细介绍了如何使用ArcGIS进行拓扑检查,快速解决面重叠与缝隙问题。通过搭建拓扑检查环境、配置拓扑规则、五步闪电修复法及批量处理技巧,帮助用户高效完成数据修正,提升GIS数据质量。特别适合地籍管理、规划红线等场景应用。

z4a5b6的博客 741

C++关键字之——class

C++关键字之——class

StephenRay的博客 4501

用 SAP-ABAP-1 把 ABAP 代码读懂:从 Generative AI Hub Orchestration 到 Joule 落地的实战指南

SAP-ABAP-1 是 SAP 推出的 ABAP 专用基础模型,专注于代码解释与理解。它能显著降低企业遗留系统的维护成本,帮助开发人员快速掌握复杂业务逻辑。该模型通过 SAP Generative AI hub 托管,支持 128,000 tokens 的上下文长度,适合分析大型 ABAP 类和 CDS 视图。典型应用场景包括代码解释、迁移辅助和云合规检查。调用需通过 Orchestration service 进行,确保企业级安全治理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1212

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

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

Rain 4万+

NSIS教程(2): 传统用户界面(Classic UI)

NSIS教程: 《NSIS用户手册 中文版》 《NSIS图文教程集锦 - 轻狂志》 本文以一个完整的、传统界面的网易云音乐安装包的脚本为示例,来介绍NSIS传统用户界面的开发流程。 NSIS脚本 # 单行注释用井号"#"或分号";",跨行注释用可以用C/C++中注释语法。 # 使用!define定义一些常量(如安装包的版本号等) # 对常量或变量的引用可以使用如${PROD

while(1) { smile(); } 8万+

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 600

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

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

qq_38053711的博客 175

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

qq_45566676的博客 324

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

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

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

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

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++】一些笔记整理

私有类里面的东西只能在类内操作,也就是我不能在其他地方直接操作这些数据,包括先初始化一个实例然后再使用也是不行的,想要使用必须在public里面写一些更改私有变量的函数,每次想要改变或者调用类的私有变量时,用Public里面的这些函数作为跳板,获取私有变量的值.构造函数会在类被初始化的时候自动运行,它没有返回值,可以用做各种函数的初始化 ,默认不会带初值,但是可以在Public里面带参数调用构造函数,这样在构造函数在运行时就会获得参数.在文件头加入这一句,可以使结构体1字节对齐,不会进行补全。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值