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

news2024/9/22 9:58:19

目录

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

二、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的值现在是10
    return 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的值现在是30
    return 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.coloradmin.cn/o/1543453.html

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

相关文章

【项目】均衡代码评测

TOC 目录 项目介绍 开发环境 主要技术 项目实现 公共模块 日志 工具类 编译运行模块 介绍 编译 运行 编译和运行结合起来 业务逻辑模块 介绍 MVC模式框架 模型&#xff08;Model&#xff09; 视图&#xff08;View) 控制器&#xff08;Controller&#xff09…

【包远程运行安装】SpringBoot+Mysql实现的在线音乐播放系统源码+运行教程+开发文档(参考论文)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的千千在线音乐播放系统&#xff0c;主要实现了在线音乐的播放和下载&#xff08;支持付费和开通VIP功能&#xff09; 除脚手架功能以外下面是系统的功能&#xff1a; 前台普通用户&#xff1a;注册、登录…

Java笔记(一)基础、流程控制、数组、面向对象基础

堆&#xff08;Heap&#xff09; &#xff1a;此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是&#xff1a;所有的对象实例以及数组都要在堆上分配。栈&#xff08;Stack&#xff09; &#xff1a;是指…

住宅IP是什么?与机房IP有哪些区别?

随着互联网的普及和发展&#xff0c;不同类型的IP地址在网络世界中扮演着重要角色。在网络架构中&#xff0c;机房IP和住宅IP是两种常见的IP类型&#xff0c;它们各有优劣&#xff0c;适用于不同的场景和需求。本文将对机房IP和住宅IP进行技术对比&#xff0c;并给出选择合适IP…

视频汇聚平台EasyCVR启用图形验证码之后调用login接口的操作方法

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

2020-Structure Aware Negative Sampling in Knowledge Graphs

摘要 使用对比估计学习知识图中实体和关系的低维表示是一种可扩展且有效的推断连接模式的方法。对比学习方法的一个关键方面是选择产生硬负样本的腐败分布&#xff0c;这迫使嵌入模型学习判别表示并找到观察数据的关键特征。虽然早期的方法要么采用过于简单的腐败分布&#xf…

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码&#xff1a; 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结&#xff1a; 逻辑回归&#xff08;Logistic…

使用zabbix自动发现规则监控oracle分区表的分区键的合法

一、 创建从数据库查询原始数据脚本 编写脚本query_table.sh vim query_table.sh #!/bin/bash temp_outfile"/tmp/table.source" outfile"/tmp/table.txt" source /home/oracle/.bash_profilesqlplus -s zabbix/zabbix>${temp_outfile}<<EOF c…

Hive SQL必刷练习题:留存率问题(*****)

留存率&#xff1a; 首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总…

Redis入门到实战-第十一弹

Redis实战热身Bitmaps篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和…

Spring boot2.7整合jetcache方法缓存 设置定时刷新 解决多系统同时操作数据问题

上文 Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作 解决了 缓存更新的问题 但是 现在有个问题 例如 我们 A系统 和 B系统 同时缓存了这一组数据 但是 A系统数据发生了更新 但是 B系统并不知道 其实 也没有特别好的办法同步通知 但可以控…

复旦大学EMBA肖仰华:人类文明或许将因为AI迎来一段“盘整期”

“君子知道”复旦大学EMBA前沿论坛上&#xff0c;复旦大学计算机学院肖仰华教授曾为企业家同学进行过主题分享。他认为&#xff0c;Sora只是开始&#xff0c;AI或让人类文明进入“盘整期”。      在人工智能的浩瀚世界中&#xff0c;Sora也只是冰山一角。当AI技术“高歌猛…

网约车APP小程序源码代驾顺风拼车货运司乘端安卓苹果源码可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

Pycharm服务器配置python解释器并结合内网穿透实现公网远程开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址&#xff0c;还有…

STM32学习笔记(6_4)- TIM定时器的输出比较和PWM代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

ssm002学院党员管理系统+jsp

鄂尔多斯应用技术学院党员管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对鄂尔多斯应用技术学…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据&#xff0c;如果我开始玩游戏之后&#xff0c;被怪物打了失去了一部分血量&#xff0c;这个时候我想退出游戏&#xff0c;当我再次进入的时候&#xff0c;希望仍然保持被怪物打之后的血量&#xff0c;而不是重新读取了数据表&#xff0c;这个时候…

$.when.apply($, deferreds).done(function() {}) 用法

$.when.apply($, deferreds).done(function() {}) 这行代码是 jQuery 中用于处理多个异步操作的一种模式。让我们逐步解释其用法&#xff1a; $.when(): 这是 jQuery 中的一个方法&#xff0c;用于创建一个新的 Deferred&#xff08;延迟&#xff09;对象。Deferred 对象用于管…

4.1.1 SN74LVC245A型总线收发器

SN74LVC245A是德州仪器(Texas Instruments)推出的一款集成电路芯片,属于SN74系列。它是一款双向总线驱动器,可用于高速CMOS逻辑电平之间的电平转换。这款芯片可以实现3.3V/5V逻辑电平之间的转换,具有高速和低功耗的特点。SN74LVC245A在电子系统中常用于数据总线的电平转换…