C++初阶——类与对象

news2024/11/19 8:42:55

目录

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 = 25
    return 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.coloradmin.cn/o/1351773.html

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

相关文章

一、HTML5简介

一、简介 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 <!…

swift-碰到的问题

如何让工程不使用storyboard和scene 删除info.plist里面的Application Scene mainifest 删除SceneDelegate.swift 删除AppDelegate.swift里面的这两个方法 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession…

javascript 常见工具函数(四)

31.RGB值和十六进制值之间的转换&#xff1a; &#xff08;1&#xff09;十六进制的颜色转为 RGB格式&#xff1a; /*16进制颜色转为RGB格式*/String.prototype.colorRgb function () {var sColor this.toLowerCase();if (sColor && reg.test(sColor)) {if (sColor.l…

【通讯录案例-登录功能-Segue Objective-C语言】

一、我们接下来呢,来说这个登录按钮的实现, 1.我们来实现一下这个登录按钮的一个功能啊, 比如说,当我点击“登录”了以后,我要跳到后边儿的那个TableView, 首先呢,我们来看一下示例程序,参考一下, 当我们上边这两个文本框都有值的时候, 当这两个文本框都有值了以后…

Nginx - 使用error_page实现带有图片的自定义错误页面

文章目录 概述官网文档需求实现 概述 在Nginx中&#xff0c;您可以使用error_page指令来指定当请求遇到特定错误时应当显示的自定义错误页面。为了实现带有图片的自定义错误页面&#xff0c;可以按照以下步骤操作&#xff1a; 创建错误页面&#xff1a; 首先&#xff0c;需要…

three.js 多通道组合

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"border: 1px so…

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

新全国产迅为龙芯 3A6000 处理器板卡

11月28日&#xff0c;“2023龙芯产品发布暨用户大会”在北京举行&#xff0c;迅为作为龙芯重要合作伙伴受邀参加&#xff0c;在整机产品发布仪式上&#xff0c;展示了基于龙芯 3A6000 处理器的全国产安全型工控计算机。 龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

Vue实现JSON字符串格式化编辑器组件

相信很多同学都用过网上的在线JSON格式化工具来将杂乱的JSON数据转换成易于我们阅读和编辑的格式。那么&#xff0c;你有没有想过自己动手实现一个这样的工具呢&#xff1f;今天&#xff0c;我将介绍如何使用Vue.js来构建一个简单的JSON格式化工具。 功能简述 支持格式化JSON字…

企业如何利用好数据,让数据真正成为数据资产?数据资产管理应该怎样建设?

数字化时代&#xff0c;数据已经成为了个人、机构、企业乃至国家的重要战略资产。 近日&#xff0c;财政部正式对外发布《企业数据资源相关会计处理暂行规定》&#xff0c;并自 2024 年 1 月 1 日开始施行。数据资产入表政策落地节奏超预期&#xff0c;标志着国家把数据作为生…

jstree高性能树型控件

一、直接上代码 这种基于服务器端生成Html结构&#xff0c;直接渲染为树&#xff0c;能很好的解决大树的问题。 {ViewData["Title"] "Home Page";Layout null; } <link href"~/jstree/themes/default/style.min.css" rel"stylesheet…

STM32CubeMX教程17 DAC - 输出三角波/噪声波

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

浪涌保护器的必要性和安装方案

浪涌保护器SPD是一种用于限制电力线路或信号线路上的瞬时过电压&#xff0c;并将其导入地线的装置&#xff0c;主要用于防止雷电或其他电源干扰对电气设备或电子设备造成损坏。浪涌保护器的类型和结构根据不同的用途和场合有所不同&#xff0c;但一般都包含一个或多个非线性电压…

后台管理系统 -- 点击导航栏菜单对应的面包屑和标签(Tag)的动态编辑功能

相信很多时候,面包屑和标签(Tag)的功能几乎是后台管理系统标配。 就是会随着路由的跳转来进行相应的动态更新。 我先展示一下效果: 1.面包屑 先说一下思路&#xff1a; 我们导航菜单点击之后,将当前显示路由对象存储到Vuex的storge里面,然后在面包屑组件里面,读取这个状态即可…

电子负载是如何实现这些功能的

电子负载模拟真实负载的电子设备&#xff0c;它可以吸收或释放电能&#xff0c;以实现对电源、电池、发电机等电源设备的测试和保护。电子负载的主要功能包括恒流、恒压、恒功率、恒电阻等模式&#xff0c;以及过压、过流、短路、过热等保护功能。那么&#xff0c;电子负载是如…

RAL论文:一种自感知扭转塔折纸软体机器人

折纸是一种以纸张折成各种不同形状的艺术活动。折纸与自然科学结合在一起&#xff0c;不仅成为建筑学院的教具&#xff0c;还发展出了折纸几何学成为现代几何学的一个分支。根据折痕的不同分布&#xff0c;可以将纸张折叠成不同的形状&#xff0c;例如有许多经典的折纸结构&…

东信免驱系列身份证阅读器串口通讯协议解析示例,适用于单片机、ARM等系统开发集成使用

完整的一次读卡流程包括&#xff1a; 身份证寻卡 > 身份证选卡 > 身份证读卡&#xff0c;三个步骤 缺一不可&#xff08;见通讯协议&#xff09;。 寻卡&#xff1a;EA EB EC ED 04 00 B0 B4 BB 返回&#xff1a;EA EB EC ED 05 00 00 B0 B5 BB 选卡&#xff1a;EA …

【EI会议征稿通知】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…