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 = 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) 类可以包含其他类的对象作为成员变量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android studio ViewPager2应用设计

一、ViewPager2应用场景&#xff1a; ViewPager2是一个功能强大的滑动容器&#xff0c;提供灵活的页面切换和布局定制功能&#xff0c;使得应用程序界面更加丰富和交互性强&#xff0c;主要应用于以下场景&#xff1a; 1&#xff09;、实现引导页或欢迎页&#xff1a;ViewPag…

Microsoft Visual Studio 2022 install Project 下载慢

1. 关闭Internet 协议版本6 2. 如果没有效果&#xff0c;打开Internet 协议版本4&#xff0c;更改DNS 3. 在浏览器中下载后安装&#xff0c;下载地址如下&#xff1a; Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace 4. 安装时注意关闭vs&…

Maven 整理(含面试题)

Maven是Java 项目必备&#xff0c;Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖 目录 Maven安装与运行maven 重要知识点面试题 Maven安装与运行 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理…

ThreadLocal线程重用导致用户信息错乱的 Bug

在生产上遇到一个诡异的问题&#xff0c;有时获取到的用户信息是别人的。查看代码后&#xff0c;我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道&#xff0c;ThreadLocal 适用于变量在线程间隔离&#xff0c;而在方法或类间共享的场景。如果用户信息的获取比较…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手&#xff08;steady state Error&#xff09; 误差 Error &#xff1a; E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

文章目录 1.概述2.Visual Studio 2022简介3.安装Visual Studio 20224.安装CMake5.创建CMake项目6. 构建项目 1.概述 CMake和Visual Studio 2022结合 在现代软件开发中&#xff0c;CMake和Visual Studio 2022的结合提供了一个强大的环境&#xff0c;用于构建和管理各种规模的C项…

1213:八皇后问题 深度优先搜索算法

1213&#xff1a;八皇后问题 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 在国际象棋棋盘上放置八个皇后&#xff0c;要求每两个皇后之间不能直接吃掉对方。 【输入】 (无) 【输出】 按给定顺序和格式输出所有八皇后问题的解&#xff08;见样例&#xff09;。 题目…

【Matlab】PSO-BP 基于粒子群算法优化BP神经网络的数据时序预测(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88689096 一&#xff0c;概述 PSO-BP算法是一种结合了粒子群算法&#xff08;PSO&#xff09;和BP神经网络的方法&#xff0c;用于数据时序预测。下面是PSO-BP算法的原理和过程&#xff1a; 1. 数据准备&…

如何移除视频中的背景音乐或人物声音

移除视频声音是将视频指定的声音移除&#xff0c;可以选择移除人物声音还是视频的背景音乐&#xff0c;方便实现二次创作。 小编给大家推荐一些方法帮助大家更轻松地移除视频中的背景音乐或人物声音&#xff0c;有兴趣的朋友请自行百度查找&#xff0c;或小程序查找 1、方法&a…

ctfshow——信息搜集

文章目录 web 1web 2web 3web 4web 5web 6web 7web 8web 9web 10web 11web 12web 13web 14web 15web 16web 17web 18web 19web 20 web 1 题目提示开发注释未及时删除。 直接右键查看源代码。 web 2 在这关我们会发现&#xff1a;1&#xff09;无法使用右键查看源代码&…

基于simiulink的flyback反激型电路建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 Flyback反激型电路的基本原理 4.2 Flyback反激型电路的数学建模 4.3 Flyback反激型电路的仿真方法 5.完整工程文件 1.课题概述 flyback反激型电路建模与仿真。反激变换器在开关管导通时电源将电能…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥&#xff0c;不会生成公钥&#xff0c;因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥&#xff0c;可以使用 openssl rsa 命令。 命令语法&#xff1a; ope…

通用图片转Excel与票证转为结构化数据的Excel识别有什么区别?

引言&#xff1a; 随着数字化时代的到来&#xff0c;大量的纸质文档需要被转换为电子格式以便于管理和分析。其中&#xff0c;表格数据的转换尤为重要。通用图片转Excel表格识别和结构化OCR识别是两种常见的技术&#xff0c;它们虽然都是用于将图片中的内容转换为可编辑的Exce…

一、HTML5简介

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

多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?

一、引言 乳腺癌是女性常见的恶性肿瘤之一&#xff0c;对女性的身体健康和生命安全产生了重要影响。早期诊断和风险评估可以帮助医生和患者制定更好的治疗方案&#xff0c;并提高治愈率和生存率。因此&#xff0c;乳腺癌风险评估模型的研究和应用变得越来越重要。 在乳腺癌风险…

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

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

页面间动画之放大缩小视图

目录 1、Exchange类型的共享元素转场 2、Static类型的共享元素转场 3、场景示例 在不同页面间&#xff0c;有使用相同的元素&#xff08;例如同一幅图&#xff09;的场景&#xff0c;可以使用共享元素转场动画衔接。为了突出不同页面间相同元素的关联性&#xff0c;可为它们…

【webstorm中通过附加方式打开一个项目,这个项目本身有git,但是却看不到git的解决方法】

1、如图所示 设置-》版本控制-》未注册的根&#xff0c;选中后&#xff0c;再点加号&#xff0c;就可以了 2、如图所示 版本控制-》直接点加号-》选中项目路径&#xff0c;vcs选择git&#xff0c;点击确定就可以了

算法分析与设计 第一次课外作业

算法分析与设计 第一次课外作业 文章目录 算法分析与设计 第一次课外作业一. 单选题&#xff08;共8题&#xff0c;80分&#xff09;二. 判断题&#xff08;共2题&#xff0c;20分&#xff09; 一. 单选题&#xff08;共8题&#xff0c;80分&#xff09; (单选题)以下叙述中错误…