C++语言学习(二)—— C++语言的基本知识

目录

一、面向对象的三个核心概念

二、C++语言中的I/O口

三、C++语言中的数据类型​​​​​​​

3.1 逻辑类型

3.2 引用类型

3.2.1 引用作为函数参数

3.2.2 引用作为函数返回值

3.2.3 引用作为类成员

3.3 类类型

四、 C++语言中的内联函数

五、 函数重载

六、 带默认形参值的函数

七、 动态内存分配和释放


一、面向对象的三个核心概念

C++语言面向对象的三个核心概念是封装、继承和多态。

  1. 封装(Encapsulation):封装是一种将数据和操作封装在类中的机制。通过使用类,我们可以将数据和方法绑定在一起,并限制外部访问这些数据和方法。这样可以隐藏实现细节,提高代码的安全性和可维护性。

  2. 继承(Inheritance):继承是指从一个现有的类派生出一个新的类,新的类称为子类或派生类,原有的类称为父类或基类。子类可以继承父类的成员变量和成员函数,并且可以添加自己的成员变量和成员函数。继承可以实现代码的重用和扩展。

  3. 多态(Polymorphism):多态是指同一个方法在不同的对象上可以有不同的行为表现。在C++中,多态通过虚函数(virtual function)和纯虚函数(pure virtual function)来实现。通过使用多态,可以在不修改原有代码的情况下,通过派生类对象调用父类的虚函数,实现不同的行为。

这三个核心概念共同构成了C++面向对象编程的基础,可以帮助程序员更好地组织和管理代码,提高代码的可重用性和扩展性。

二、C++语言中的I/O口

在C++语言中,可以通过使用I/O流来实现对I/O口的操作。I/O口是计算机与外部设备之间进行输入输出的接口,它可以用于与键盘、显示器、硬盘、串口等设备进行通信。

在C++语言中,>>符号可以用于两种不同的用途:

  • 输入运算符:输入运算符>>用于将数据从输入流(例如键盘)读取到变量中。通常与cin对象一起使用。
  • 右移运算符:右移运算符>>用于对二进制数进行右移操作。它会将一个数的二进制表示向右移动指定的位数,并将结果返回。

在C++语言中,<<符号的用途:

  • <<符号是一个重载运算符,用于实现输出流的对象插入操作符。它被用于向输出流中插入数据。输出流对象可以使用<<符号连接多个数据,数据会按照从左到右的顺序插入到输出流中。

在C++语言中,可以使用iostream头文件提供的iostream库来操作I/O流。iostream库提供了两个基本的I/O流对象,即cin和cout。

  • cin:是一个标准输入流对象,可以用来接收用户的输入。可以使用>>操作符来从标准输入流中读取数据。
int num;
cin >> num; // 从标准输入流中读取一个整数并存储到num变量中

  • cout:是一个标准输出流对象,可以用来输出数据到屏幕上。可以使用<<操作符来将数据输出到标准输出流中。
int num = 10;
cout << "The number is: " << num << endl; // 将字符串和变量的值输出到标准输出流中

除了cin和cout,还有cerr和clog这两个标准错误输出流对象,它们用于将错误信息输出到屏幕上。cerr是无缓冲的输出流,而clog是有缓冲的输出流,它们的使用方式和cout类似。

cerr << "Error occurred!" << endl; // 将错误信息输出到标准错误输出流中

需要注意的是,I/O操作是相对较为慢速的操作,因此在进行大量的I/O操作时,应尽量减少不必要的输出,以提高程序执行效率。

三、C++语言中的数据类型

C++语言中的数据类型可以分为基本数据类型、构造数据类型和抽象数据类型。

3.1 逻辑类型

逻辑类型(logic types)指的是能够表示真值(true/false)的数据类型。C++中定义了bool类型来表示逻辑类型,其中true代表真,false代表假。

逻辑类型主要用于表示条件判断和布尔逻辑运算,常用于控制结构的条件表达式中,例如if语句和循环语句。逻辑类型可以通过比较运算符(例如==、!=、<、>等)进行比较,也可以通过逻辑运算符(例如&&、||、!等)进行逻辑运算。

3.2 引用类型

C++语言中的引用类型是指使用引用来操作变量的一种数据类型。引用类型是对已存在的变量起一个别名,通过引用可以直接操作原变量,而不需要通过指针来访问。

C++语言中的引用类型有三种主要的用法:

3.2.1 引用作为函数参数

引用可以用作函数的参数,通过引用传递参数可以直接修改原变量的值,而不需要进行复制。这样可以提高程序的效率,并且避免了不必要的内存消耗。例如:

void swap(int &a, int &b) {int temp = a;a = b;b = temp;
}int main() {int num1 = 10;int num2 = 20;swap(num1, num2);// num1的值现在是20,num2的值现在是10return 0;
}

3.2.2 引用作为函数返回值

函数可以返回引用类型的值,这样可以避免复制大量的数据,而直接返回原变量的引用。需要注意的是,返回引用时,被引用的变量的生命周期必须长于引用的使用,否则可能导致引用悬空的问题。例如:

int& getLarger(int& a, int& b) {if (a > b) {return a;} else {return b;}
}int main() {int num1 = 10;int num2 = 20;int& larger = getLarger(num1, num2);larger = 30;// num2的值现在是30return 0;
}

3.2.3 引用作为类成员

引用可以作为类的成员变量,这样可以在类中直接操作引用所引用的变量,而不需要使用指针。需要注意的是,成员引用必须在类的构造函数中进行初始化,并且一旦初始化后,就不能再引用其他变量。例如:

class Person {
public:Person(string& name) : m_name(name) {}void printName() {cout << m_name << endl;}private:string& m_name;
};int main() {string name = "John";Person person(name);person.printName(); // 输出 "John"return 0;
}

3.3 类类型

类的对象是类类型的实例,可以使用类名后跟一个对象名称创建对象。通过对象可以访问类的成员变量和成员函数。

类类型的对象可以通过构造函数进行初始化,构造函数是一种特殊的成员函数,用于在对象创建时初始化对象的状态。

四、 C++语言中的内联函数

在C++中,内联函数是一种编译器优化技术,用于在函数调用时直接将函数的代码插入到调用者的代码中,而不是通过跳转到函数的地址执行函数体。使用内联函数可以提高程序的执行效率,减少函数调用的开销。

C++中的内联函数通过在函数定义前面加上关键字"inline"来声明。例如:

inline int add(int a, int b) {return a + b;
}

在上面的代码中,add函数被声明为内联函数。当调用add函数时,编译器会将函数体直接插入到调用者的代码中,而不是跳转到add函数的地址执行。

C++中的内联函数通过在函数定义前加上关键字"inline"来声明,用于提高程序的执行效率。适用于简单、短小的函数,通常定义在头文件中。

五、 函数重载

函数重载是指在一个程序中可以有多个同名函数,但这些函数的参数类型、参数个数或参数顺序不同。当调用这个函数时,编译器会根据参数的类型、个数和顺序来确定具体调用的是哪个函数。函数重载可以提高程序的灵活性和可读性,使代码更加简洁和优雅。

在C++中,函数重载是通过函数的参数列表来实现的。

例如,下面是两个同名函数的定义:

void print(int num) {cout << "The number is: " << num << endl;
}void print(string text) {cout << "The text is: " << text << endl;
}

这两个函数都叫做print,但参数类型不同,第一个函数接受一个int类型的参数,第二个函数接受一个string类型的参数。

当调用这个print函数时,编译器会根据传入的参数的类型来确定具体调用的是哪个函数。例如:

print(10);           // 调用print(int num)
print("Hello");      // 调用print(string text)

这样,就可以根据不同的参数类型来选择调用不同的函数,实现函数的重载。

六、 带默认形参值的函数

C++中可以定义带有默认参数值的函数。默认参数值是指在函数声明或定义时给函数参数赋予一个默认值,如果在函数调用时未提供实际参数,则会使用默认值。

下面是一个带有默认参数值的函数的例子:

void printMessage(string message = "Hello, World!") {cout << message << endl;
}

在上面的例子中,函数printMessage有一个字符串类型的参数message,并给它赋予了默认值"Hello, World!"。

当调用printMessage函数时,可以选择提供实际参数来覆盖默认值,或者不提供实际参数使用默认值。例如:

printMessage();                 // 输出: Hello, World!
printMessage("Goodbye!");       // 输出: Goodbye!

在第一个调用中,由于没有提供实际参数,所以函数使用了默认值"Hello, World!"。在第二个调用中,提供了实际参数"Goodbye!",覆盖了默认值。

需要注意的是,带有默认参数值的参数必须放在参数列表的末尾,不能跳过某个参数给后面的参数赋予默认值。例如:

void printNumbers(int a, int b = 0, int c) {cout << a << ", " << b << ", " << c << endl;
}

上面的函数定义是错误的,因为默认参数值必须是在参数列表的末尾。应该将参数c放在默认参数值的前面,才能正确使用默认参数。

七、 动态内存分配和释放

C++中的动态内存分配和释放是通过new和delete关键字来实现的。

使用new关键字可以在堆上分配一块指定类型的内存,并返回其地址。我们可以将此地址赋值给一个指针变量,以便后续访问和使用。

例如,以下代码演示了如何使用new动态分配一个int类型的内存块:

int* p = new int;

上述代码将分配一块int类型的内存,并将其地址赋值给指针变量p。

使用delete关键字可以释放之前通过new分配的内存。释放内存后,我们就不能再访问被释放的内存块,否则会导致未定义行为。

例如,以下代码演示了如何使用delete释放之前分配的int类型内存块:

delete p;

上述代码将释放之前通过new分配的int类型的内存块。

注意:

使用new分配的内存必须使用delete进行释放,否则会导致内存泄漏。同时,释放已经释放过的内存或堆栈上的内存也会导致未定义行为。

另外,还可以使用new[]和delete[]关键字来分配和释放一维动态数组的内存。例如:

int* arr = new int[5];
delete[] arr;

上述代码将分配一个包含5个int类型元素的动态数组,并在使用完后通过delete[]释放内存。

注意:

使用new[]分配的数组内存必须使用delete[]进行释放,否则会导致内存泄漏。同样,释放已经释放过的内存或堆栈上的内存也会导致未定义行为。

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

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

相关文章

docker 容器挂掉,无法exec 进入bash 怎么修改容器里的文件

在使用tdengine 数据库时出现了 TDengine.Driver.TDengineError:“code:[0x334],error:Out of dnodes” 查找文档发现需要修改一个配置文件 。 /etc/taos/taos.cfg 中的 supportVnodes 参数 于是修改 保存。然后&#xff0c;运行出错。 03/21 06:56:27.986498 00000064 …

IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

[音视频学习笔记]六、自制音视频播放器Part1 -新版本ffmpeg,Qt +VS2022,都什么年代了还在写传统播放器?

前言 参考了雷神的自制播放器项目&#xff0c;100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 不过老版本的代码参考意义不大了&#xff0c;我现在准备使用Qt VS2022 FFmpeg59重写这部分代码&#xff0c;具体的代码仓库如下&#xff1a; …

基于python+vue渔船出海及海货统计系统的设计与实现flask-django-php-nodejs

当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统渔船出海及海货统计采取了人工的管理方法&#…

抖音视频爬虫下载软件|可导出视频分享链接|视频批量采集工具

无水印视频关键词批量下载工具操作指南 我们自主开发了一款便捷的音视频批量下载工具&#xff0c;不仅支持单个视频链接提取&#xff0c;还可通过关键词搜索实现批量采集和选择性下载&#xff0c;让您轻松获取所需视频内容。 操作说明&#xff1a; 关键词批量采集视频 进入软件…

AI绘画可以稳定生成中文了:白嫖阿里云部署AnyText

长久以来&#xff0c;在AI绘画中书写文字一直是个难题。即使到了SDXL时代&#xff0c;我们也只能输出英文&#xff0c;而且还经常出现漏掉字母的情况。现在阿里达摩院搞出了一个解决方案&#xff0c;可以在Stable Diffusion生成的作品中稳定输出中、英、日、韩等多种文字&#…

python共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b; 语言&#xff1a;Python 框架&#xff1a;django/flask 软件版本&#xff1a;python3.7.7 数据库…

【Unity】从0到1的横版2d制作笔记-DAY3

确定碰撞体积 选择rigidbody2d&#xff0c;创建player重力 创建player碰撞体积 创建瓦片地图碰撞体积 使平台变成一个整体 ​​​​​ 设置Body Type为Static&#xff08;避免平台也因为重力影响下落&#xff09; 回到Player&#xff0c;在Rigidbody2D中设置为冻结旋转 Player设…

python家政服务系统flask-django-php-nodejs

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低家政公司的运营人员成本&#xff0c;实现了家政服务的标准化、制度化、程序化的管理&#xff0c;有效地防止了家政服务的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地…

解决mini2440 LCD(型号:P43)驱动的背光失效问题

目录 概述 1 LCD(P43)背光问题 1 移植LCD驱动程序 1.1 编写驱动代码 1.2 编写LCD的配置参数 1.3 配置LCD驱动至内核 2 移植触摸功能程序 2.1 移植ADC驱动程序 2.1.1 编写ADC驱动代码 2.1.2 编写配置文件 2.2 移植P43的一线触摸程序 2.2.1 编写代码 2.2.2 编写配置链…

-bash: ./1.sh: /bin/bash^M: bad interpreter: No such file or directory解决方法

1、执行脚本 ./1.sh时报如下错误 -bash: ./1.sh: /bin/bash^M: bad interpreter: No such file or directory 2、在Windows编辑的脚本导入Linux系统中&#xff0c;执行报错问题 yum install -y dos2unix 3、或者本地安装 rpm -ivh /mnt/Packages/dos...... 4、然…

基于python+vue中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

利用Jmeter工具对服务器,数据库进行性能监控,压测,导出性能测试报告

Jmeter是Apache基金会旗下的一款免费,开源,轻量级的性能测试工具,主要针对web应用程序客户端/服务器进行性能测试.它可以分别测试静态、动态资源(Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等),它可以通过线程组来模拟数个用户,在一段时间内同时登录服务器,数个用…

Matlab使用教程(持续更新)

1. Matlab Matlab被广泛的应用在数据分析&#xff0c;汽车仿真&#xff0c;机器人以及医学研究等众多方面。 它可以帮助我们理解研究复杂的系统。 在60年代和70年代&#xff0c;计算机使得科学家和工程师完成了以前不可能进行的计算&#xff1b;但是需要懂得计算机编程。 C…

CMU 10-414/714: Deep Learning Systems --hw4

通过之前作业中完成的所有组件,使用高性能的网络结构来解决一些问题。首先会增加一些新的算子(使用CPU/CUDA后端),然后完成卷积、以及用一个卷积神经网络来在CIFAR-10图像数据集上训练一个分类器。接着需要完成循环神经网络(带LSTM),并在Penn Treebank数据集上完成字符级…

AI原生安全 亚信安全首个“人工智能安全实用手册”开放阅览

不断涌现的AI技术新应用和大模型技术革新&#xff0c;让我们感叹从没有像今天这样&#xff0c;离人工智能的未来如此之近。 追逐AI原生&#xff1f;企业组织基于并利用大模型技术探索和开发AI应用的无限可能&#xff0c;迎接生产与业务模式的全面的革新。 我们更应关心AI安全原…

【高频SQL题目进阶版】1440.计算布尔表达式的值

错误答案&#xff1a; 我一开始以为&#xff0c;既然都能拿到值了&#xff0c; 那么把它们合并起来就可以了。后来发现不行。。 1 concat concat(v1.value ,operator ,v2.value) 它不是一个条件&#xff0c;而只是一个字符串 。 而if (condition, true_value, false_value)…

从后端获取文件数据并导出

导出文件的公共方法 export const download (res, tools) > {const { message, hide } tools;const fileReader: any new FileReader();console.log(fileReader-res>>>, res);fileReader.onload (e) > {if (res?.data?.type application/json) {try {co…

docker方式进行pytorch多机多卡分布式训练

docker ip共享与gpu指定 1)ip共享 docker网络有多种,这里选择host直接用宿主机的ip 2)指定gpu docker方式进行pytorch多机多卡分布式训练 nvidia docker 容器介绍链接:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/ docker用的nvidia官方镜像…

数字孪生与智慧城市:重塑城市生活的新模式

随着信息技术的迅猛发展&#xff0c;数字孪生作为一种新兴的技术理念&#xff0c;正在逐渐改变城市建设和管理的传统模式。智慧城市作为数字孪生技术应用的重要领域&#xff0c;正在以其独特的优势和潜力&#xff0c;重塑着城市生活的方方面面。本文将从数字孪生的概念、智慧城…