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.rhkb.cn/news/282265.html

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

相关文章

四、分布式锁之自定义分布式锁

1、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多个进程可见并且互斥的锁。分布式锁的核心思想就是多线程都使用同一把锁&#xff0c;实现程序串行执行。 分布式锁需要具备的条件&#xff1a; 特性含义可见性多个线程都能感知到变化互斥性分布…

数据库系统概论-第16章 数据仓库与联机分析处理技术

概念性的介绍&#xff0c;一略而过&#xff0c;不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

Linux/Ubuntu/Debian从控制台启动程序隐藏终端窗口

如果你想从终端运行应用程序但隐藏终端窗口. 你可以这样做&#xff1a; 在后台运行&#xff1a; 你只需在命令末尾添加一个与号 (&) 即可在后台运行它。 例如&#xff1a; your_command &将 your_command 替换为你要运行的命令。 这将在后台启动该命令&#xff0c…

Three.js基础入门介绍——【毕业季】Three.js动态相册

前言 岁月匆匆&#xff0c;又是一年毕业季&#xff0c;这次做个动态相册展示图片&#xff0c;放些有意思的内容&#xff0c;一起回忆下校园生活吧。 预期效果 相册展示和点选切换&#xff0c;利用相机旋转和移动来实现一个点击切图平滑过渡的效果。 实现流程 基本流程 1、搭…

【python】python汽车效能数据集—回归建模(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【学习】软件测试行业未来的发展趋势预测

近年来&#xff0c;随着中国数字经济的蓬勃发展&#xff0c;软件测试行业也迎来了新的春天。从早期的手工测试到自动化测试&#xff0c;再到持续集成和持续交付&#xff0c;中国的软件测试行业经历了快速的发展和变革。各行各业均对软件测试提出了更高的要求&#xff0c;尤其在…

将数据转换成xml格式的文档并下载

现在有一个实体类对象的集合&#xff0c;需要将它们转换为xml文档&#xff0c;xml文档就是标签集合的嵌套&#xff0c;例如一个学生类&#xff0c;有姓名、年龄等&#xff0c;需要转换成一下效果&#xff1a; <student><age>14</age><name>张三</na…

【Java】Oracle发布Java22最新版本

甲骨文&#xff08;ORACLE&#xff09;已经于2023年3月19日正式发布了最新版本的JDK&#xff0c;版本号&#xff1a;22 根据官方声明&#xff0c;Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进&#xff0c;包括对Java 语言、其API 和性能&#xff0c;以…

docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式

1、解释 docker0 veth eth 2、vethXX 和 ethXX 是肯定一一对应吗 比如 eth1 对应 veth1 3、如果 A容器使用 默认创建方式 。定义他内部网络为 eth0&#xff0c;容器B使用 --network 连上 已创建的网络 172.89.2.1 。此时假设 B的 ip是 172.89.2.2 &#xff0c;容器网络接口是 e…

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

C++初阶:vector相关练习

目录 1. 只出现一次的数2. 杨辉三角3. 删除有序数组中的重复项4. 只出现一次的数II5. 只出现一次的数III6. 数组中出现次数超过一半的数7. 电话号码的字母组合&#xff08;多叉树遍历&#xff09; 1. 只出现一次的数 题目信息&#xff1a; 题目链接&#xff1a; 只出现一次的数…

工程信号的去噪和(分类、回归和时序)预测

&#x1f680;【信号去噪及预测论文代码指导】&#x1f680; 还为小论文没有思路烦恼么&#xff1f;本人专注于最前沿的信号处理与预测技术——基于信号模态分解的去噪算法和深度学习的信号&#xff08;回归、时序和分类&#xff09;预测算法&#xff0c;致力于为您提供最精确、…

ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

蓝桥杯刷题(十三)

1.煤球数目 代码 cnt ans 0 start 1 a [] while cnt<100:ansstartstart 1t ansstartcnt1a.append(ans) print(sum(a))2.奖券数目 代码 def f(x)->bool:while x:if x%104:return Falsex//10return True ans 0 for i in range(10000,100000):if f(i):ans1 print(a…

二叉搜索树(二叉排序树)(含力扣相关题及题解)

文章目录 二叉搜索树&#xff08;二叉排序树&#xff09;1、二叉搜索树概念2、二叉搜索树的操作2.1、二叉搜索树的查找2.2、二叉搜索树的插入2.2、二叉树的删除 3、二叉搜索树的实现&#xff08;含递归版本&#xff09;4、二叉搜索树的应用4.1、K模型4.2、KV模型 5、二叉搜索树…

C语言例:设 int x; 则表达式 (x=4*5,x*5),x+25 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int x,m;m ((x4*5,x*5),x25);printf("(x4*5,x*5),x25 %d\n",m);//x4*520//x*5100//x2545return 0; } 结果如下&#xff1a;

拌合楼管理系统开发(十) 不谈技术只谈管理之大宗物资虚假贸易

前言:不谈技术只谈管理 大宗物资往往都是虚假贸易的重灾区,多年前规模就是面子的口号下,一大批国央企挖空心思做大规模,开展了一大批虚假贸易,同时为了面上的合规性,往往会有三方甚至更多方进入到整个链条中,钱货在这个链条中流转,甚至有些就是钱在流转,如果整个链条有一个环节…

电视盒子哪款好?数码小编分享电视盒子品牌排行榜

电视盒子是我们使用最多的数码产品自已&#xff0c;在挑选电视盒子这块超多朋友踩过雷&#xff0c;广告多&#xff0c;频繁卡顿&#xff0c;收费节目多&#xff0c;究竟电视盒子哪款好&#xff1f;本期小编要分享的就是目前最值得入手的电视盒子品牌排行榜&#xff0c;想买电视…