C++初阶——类与对象

目录

C++宏函数

在使用宏函数时,有几个常见的错误需要注意:

宏函数在某些情况下有以下优势: 


1.C++宏函数

在 C++ 中,宏函数(Macro Function)是使用预处理器定义的宏(Macro),类似于 C 语言中的宏函数。它们在编译前进行文本替换,以实现一些简单的函数功能。

C++ 中的宏函数与 C 语言中的宏函数定义方式相同,用 #define 指令来定义。宏函数可以接受参数,并且没有函数调用的开销。

下面是一个使用宏函数计算两个整数的平方和的示例:

#define SQUARE_SUM(x, y) ((x)*(x) + (y)*(y))int main() {int a = 3;int b = 4;int result = SQUARE_SUM(a, b);// 展开后的宏函数:((a)*(a) + (b)*(b))// 计算结果为 3*3 + 4*4 = 9 + 16 = 25return 0;
}

在上面的示例中,我们使用 #define 定义了一个名为 SQUARE_SUM 的宏函数,它接受两个参数 x 和 y。宏函数展开后,会将参数的值替换到相应的位置,然后进行平方和的计算。

需要注意的是,宏函数的展开是在编译前进行的,因此宏函数中的参数没有类型检查。这也是宏函数的一个缺点,可能会导致一些错误,例如参数计算多次、副作用等问题。

在 C++ 中,宏函数的使用相对较少,更推荐使用内联函数或模板来替代宏函数。内联函数和模板可以提供更好的类型安全性和可读性,并且能够进行编译时的优化。

总之,C++ 中的宏函数是通过预处理器定义的宏,用于实现简单的函数功能。它们在编译前进行文本替换,没有函数调用的开销,但可能存在潜在的问题,因此在实际编程中建议使用内联函数或模板代替宏函数。0

在使用宏函数时,有几个常见的错误需要注意:

  1. 缺少括号:由于宏函数展开是简单的文本替换,没有类型检查,因此在宏函数中使用参数时应该用括号将参数括起来,以避免优先级问题。例如,#define SQUARE(x) x * x 这个宏函数没有正确使用括号,会导致展开后的结果不符合预期。

  2. 副作用问题:宏函数的参数可能会被多次计算,在某些情况下可能导致副作用。例如,#define MAX(a, b) ((a) > (b) ? (a) : (b)) 这个宏函数在计算参数时会对它们进行多次求值,如果参数中包含有副作用的表达式(例如函数调用、改变变量等),则可能会导致意外的结果。

  3. 名称冲突:宏函数的名称是全局的,容易与其他代码中的变量或函数名称发生冲突。为了避免名称冲突,通常可以在宏函数名称前添加特定的前缀或命名空间。

  4. 缺乏类型安全:宏函数没有类型检查,参数的类型和数量都是由开发者自行控制。这可能导致难以发现的类型错误或潜在的问题。为了提高类型安全性,建议使用内联函数或模板代替宏函数。

  5. 可读性差:宏函数展开后的代码可能会变得非常冗长,可读性较差。这使得调试和维护代码变得困难。使用内联函数或模板可以提高代码的可读性和可维护性。

总之,在使用宏函数时,需要注意上述常见的错误,并尽量避免使用宏函数可能带来的潜在问题。如果有更复杂的功能需求,建议使用内联函数、模板或其他更合适的方法来实现。

宏函数在某些情况下有以下优势: 

  1. 没有函数调用开销:宏函数在编译时被展开为代码,没有函数调用的开销,可以提高程序的执行效率。

  2. 可以使用常量表达式:宏函数可以使用常量表达式作为参数,这些表达式在编译时就会被计算,并且展开后的代码也是常量表达式,可以进行编译时的优化。

  3. 可以完成简单的操作:宏函数通常用于实现简单的操作,例如计算平方、计算最大值等,可以提高代码的可读性和可维护性。

  4. 可以实现一些高级功能:宏函数可以实现一些高级功能,例如条件编译、调试信息输出等。在一些特殊的情况下,它们可以代替其他更复杂的解决方案。

  5. 具有灵活性:宏函数可以根据需要定义不同的版本,例如根据不同的平台或编译器来定义不同的实现。这使得宏函数具有一定的灵活性和适应性。

总之,在某些情况下,使用宏函数可以提高程序的效率和可读性,实现一些简单和高级功能。但是,在使用宏函数时,需要注意潜在的问题,并尽量避免使用它们可能带来的副作用和错误。

让我们来了解一下C++中的类和对象。

2.类

在C++中,类是一种用户自定义的数据类型,它可以封装数据成员和函数成员,从而表示某种抽象概念。类定义的一般形式为:

class ClassName {private:// 私有成员变量public:// 公有成员变量和函数
};

其中,private表示私有成员,只能在类内部访问;public表示公有成员,可以在类内部和外部访问。

例如,下面是一个简单的类定义:

class Dog {private:int age;string name;public:void bark() {cout << "汪汪!" << endl;}void setAge(int a) {age = a;}void setName(string n) {name = n;}void printInfo() {cout << "我是一只 " << name << ",今年 " << age << " 岁。" << endl;}
};

这个类表示了一只狗的抽象概念,包含了年龄和名字两个私有成员,以及叫声、设置年龄、设置名字、输出信息等公有成员。

3.对象

在C++中,通过类定义出来的具体实例被称为对象。对象具有类成员的特征,可以调用公有成员函数,访问公有成员变量。对象的一般形式为:

ClassName ObjectName;

例如,我们可以通过上面定义的Dog类来创建一个狗的对象:

Dog myDog;

这个对象名为myDog,它具有Dog类的属性和行为,可以调用公有成员函数,访问公有成员变量。例如,我们可以设置它的年龄和名字,然后输出它的信息:

myDog.setAge(3);
myDog.setName("小黄");
myDog.printInfo();

运行结果为

我是一只 小黄,今年 3 岁。

这样,我们就成功地使用C++中的类和对象了。

4.C++中的类与对象带来了许多优势

包括:

  1. 封装性:类允许将数据和相关的函数封装在一起,形成一个独立的实体。这样可以隐藏实现细节,对外部提供接口,提高代码的安全性和可维护性。

  2. 继承性:通过继承,一个类可以从另一个类派生,获得父类的属性和方法,并可以在此基础上添加新的功能。继承提供了代码重用的机制,减少了重复编写代码的工作量。

  3. 多态性:C++支持运行时多态,即通过函数重写和虚函数实现。多态性使得不同类型的对象可以以相同的方式被处理,提高了代码的灵活性和可扩展性。

  4. 数据抽象:类可以定义抽象数据类型,将数据和操作封装在一起。这样可以将内部细节隐藏起来,只对外提供必要的接口,提高了代码的可读性和可维护性。

  5. 可扩展性:类允许在已有的基础上进行扩展和修改。可以通过添加新的成员函数或成员变量来增加功能,也可以通过派生新的类来扩展已有的类。

  6. 数据共享和保护:类的对象可以根据需要创建多个实例,每个实例都有独立的数据。这样可以实现数据的共享和保护,不同对象之间的数据不会相互干扰。

  7. 可维护性:类的使用使得代码更加模块化和结构化,易于维护和调试。类的修改只需要关注特定的部分,不会影响到其他部分,降低了出错的概率。

5.C++类的案例

#include <iostream>
using namespace std;class Rectangle {private:int width, height;public:Rectangle() {width = 0;height = 0;}Rectangle(int w, int h) {width = w;height = h;}void setWidth(int w) {width = w;}void setHeight(int h) {height = h;}int getArea() {return width * height;}
};int main() {Rectangle r1;Rectangle r2(3, 4);r1.setWidth(5);r1.setHeight(6);cout << "r1 area is " << r1.getArea() << endl;cout << "r2 area is " << r2.getArea() << endl;return 0;
}

上述代码定义了一个名为Rectangle的类,用于计算矩形的面积。该类包含两个私有成员变量width和height,以及构造函数、设置宽高的函数和计算面积的函数。在main函数中,创建了两个Rectangle对象r1和r2,分别通过构造函数和设置函数设置其宽高,并调用getArea函数计算面积并输出。

以上仅是一个简单的案例,展示了C++类的基本使用方法,实际应用中类可以包含更多的成员变量和成员函数,实现更加复杂的操作。

6.C++类相关的选择题

以及它们的答案:

6.1以下哪个选项描述了C++类的封装性?

  • a) 类的继承性 b) 类的多态性 c) 类的数据抽象性 d) 类的可扩展性

答案: c) 类的数据抽象性

6.2在C++中,通过继承可以实现什么?

  • a) 封装数据和函数 b) 对象的创建和销毁 c) 代码的重用和扩展 d) 多个对象之间的通信

答案: c) 代码的重用和扩展

6.3下面关于C++类的说法正确的是:

  • a) 类只能有一个成员变量 b) 类可以直接访问私有成员变量 c) 类可以包含其他类的对象作为成员变量 d) 类不能包含静态成员变量

答案: c) 类可以包含其他类的对象作为成员变量

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

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

相关文章

初识Linux下进程

&#x1f30e;初识进程 初识进程 简单认识一下进程 如何管理进程 进程属性信息 内核运行队列 查看进程 通过系统调用获取进程标识符       父子进程       查看运行中的进程 总结 前言&#xff1a; 我们在电脑上点开的一个个应用&#xff0c;其实就是一个个进程&am…

初识Java并发,一问读懂Java并发知识文集(4)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

智能标志桩:防盗防外物入侵_图像监测_态势感知_深圳鼎信

智能标志桩是一种新型的智能化标志设备&#xff0c;主要用于标识地下管道的位置、类型等&#xff0c;起警示作用。这与传统的标志桩大不相同&#xff0c;物联网的高速发展赋予了智能标志桩科技的力量&#xff0c;使它可以连接互联网&#xff0c;还具备图像监控的功能&#xff0…

2024年P气瓶充装证考试题库及P气瓶充装试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证考试题库及P气瓶充装试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的P气…

C++Qt6 多种排序算法的比较 数据结构课程设计 | JorbanS

一、 问题描述 在计算机科学与数学中&#xff0c;一个排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种能将一串资料依照特定排序方式排列的算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法&#xff08;例如搜索算法与合…

Linux系统操作常用指令

打开终端&#xff1a; ctrlshiftt:切换标签 ctrlshiftn:新增窗口 Linux命令大全(超详细版)_第二范式的博客-CSDN博客 VMware运行时以管理员身份运行&#xff0c;可以避免许多问题。 输入法切换 ctrl 空格 放大终端&#xff1a;ctrlshift"" 缩小终端&#xff1a;ctrl“…

【深度学习-基础学习】Transformer 笔记

本篇文章学习总结 李宏毅 2021 Spring 课程中关于 Transformer 相关的内容。课程链接以及PPT&#xff1a;李宏毅Spring2021ML这篇Blog需要Self-Attention为前置知识。 Transfomer 简介 Transfomer 架构主要是用来解决 Seq2Seq 问题的&#xff0c;也就是 Sequence to Sequence…

web前端——clear可以清除浮动产生的影响

clear可以解决高度塌陷的问题&#xff0c;产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…

【已解决】打印PDF文件,如何跳过不需要的页面?

打印PDF文件的时候&#xff0c;有时候我们只需要打印其中的几页&#xff0c;并不需要全部打印&#xff0c;那如何在打印时跳过那些不需要的页面呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 如果你是通过网页打开PDF文件&#xff0c;那么可以在页面中找到并点击“打…

[每周一更]-(第53期):Python3和Django环境安装并搭建Django

Python和Django 的安装 Python和Django 兼容情况 django 1.11.x python 2.7 3.4 3.5 3.6 LTS python 目前在用版本 Python 3.6.5 2018-03-28 更新Python 2.7.15 2018-05-01 更新Python 2.7.5 2013-05-12 更新 python和python3安装pip 同时安装上 python2.7.18、python3.11…

c语言结构体学习上篇

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 前言 昨…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】

一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入&#xff0c;说明安装好了 1.4 与鱼皮不同点 1&#xff09;mybatis 版本不一致 鱼皮&#xff1a; 本人&#xff1a; 2&#xff09;鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤&#xff0c;再来看】 …

Git - 强制替换覆盖 master 分支解决方案

问题描述 在版本迭代中&#xff0c;通常会保持一个主分支 master&#xff0c;及多个 dev 分支&#xff0c;但是因为 dev 分支的开发周期过长&#xff0c;迭代太多而没有及时维护 master &#xff0c;导致后来发版上线的大部分代码都在 dev 分支上&#xff0c;如果将代码在 mas…

LiveGBS流媒体平台GB/T28181功能-用户管理通道权限管理关联通道支持只看已选只看未选添加用户备注角色

LiveGBS功能用户管理通道权限管理关联通道支持只看已选只看未选添加用户备注角色 1、用户管理2、添加用户3、关联通道3.1、只看已选3.2、只看未选 4、自定义角色5、搭建GB28181视频直播平台 1、用户管理 LiveGBS支持用户管理&#xff0c;添加用户&#xff0c;及配置相关用户权…

promise.prototype.finally重写和兼容火狐低版本浏览器

一、finally()方法用于指定不管 Promise 对象最后状态如何&#xff0c;都会执行的操作。该方法是 ES2018 引入标准的 let promise new Promise() promise .then(result > {}) .catch(error > {}) .finally(() > {})finally方法的回调函数不接受任何参数;finally方法…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 先看效果 Tree 树形控件 保留过滤值的子级 <el-treeclass"filter-t…

直观从零理解 梯度下降(Gradient descent) VS 随机梯度下降 (Stochastic gradient descent) 函数优化

首发于Data Science 单变量微分(Differentiation) 常用基本微分有&#xff1a; 四则运算法则&#xff1a; 链式法则(Chain-rule) 极大值(maxima)与极小值(minima) 向量微分 梯度下降(Gradient descent):几何直觉 学习率&#xff08;Learning Rate&#xff09;的直观理解…

笔记中所得(已删减)

1.交流电的一个周期内电压/电流的平均值都为0 2.电动势:电池将单位正电荷由负极搬到正极所做的功 5.额定能量:电池的额定容量乘以标称电压,以Wh为单位 6.500mAh意义是可以以500mA的电流放电1小时 7.电池容量的单位是mAh 13.实际电流源不能串联 14. 15. 16. 17. 18. 19.电…

C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课

关于二进制图片的读取和BLOB插入一共包含五步 第一步&#xff1a;初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步&#xff1a;预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步&#xff1a;绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…

车规级芯片NCV4275CDT50RKG LDO线性电压调节器 原理、参数及应用

关于车规级芯片&#xff08;Automotive Grade Chip&#xff09;&#xff0c;车规级芯片是专门用于汽车行业的芯片&#xff0c;具有高可靠性、高稳定性和低功耗等特点&#xff0c;以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&#xff08;ECU&#xff09;和…