C++(区别于C的)基础内容总结

参考:

C++ 教程 | 菜鸟教程 (runoob.com)

简介

C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。

C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。

C++ 程序的源文件通常使用扩展名 .cpp、.cp 、.cc或 .c。

面向对象程序设计

C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:

  • 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。

  • 继承(Inheritance):继承是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可以提高代码的复用性和可扩展性。

  • 多态(Polymorphism):多态是指同一种操作作用于不同的对象,可以有不同的解释和实现。它可以通过接口或继承实现,可以提高代码的灵活性和可读性。

  • 抽象(Abstraction):抽象是从具体的实例中提取共同的特征,形成抽象类或接口,以便于代码的复用和扩展。抽象类和接口可以让程序员专注于高层次的设计和业务逻辑,而不必关注底层的实现细节。

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。

  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。

  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

如果您使用的是 Linux 或 UNIX,请在命令行使用下面的命令来检查您的系统上是否安装了 GCC:

$ g++ -v

程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。

c语言编译使用gcc,c++编译使用g++

比如多个 C++ 代码文件,如 runoob1.cpp、runoob2.cpp,编译命令如下:

g++ runoob1.cpp runoob2.cpp -o runoob

生成一个 runoob 可执行文件。

C++ 程序结构

让我们看一段简单的代码,可以输出单词 Hello World

#include <iostream>
using namespace std;// main() 是程序开始执行的地方int main()
{cout << "Hello World"; // 输出 Hello Worldreturn 0;
}

接下来我们讲解一下上面这段程序:

  • C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 <iostream>

  • 下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。

  • 下一行 // main() 是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。

  • 下一行 int main() 是主函数,程序从这里开始执行。

  • 下一行 cout << "Hello World"; 会在屏幕上显示消息 "Hello World"。

  • 下一行 return 0; 终止 main( )函数,并向调用进程返回值 0。

以下主要说明C++和C不一样的一些基础语法。

其实,大体上来说,C++=C语言+面向对象。

基本的内置类型

C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:

其实 wchar_t 是这样来的:

typedef short int wchar_t;

所以 wchar_t 实际上的空间是和 short int 一样。

类型转换

类型转换是将一个数据类型的值转换为另一种数据类型的值。

C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。

静态转换(Static Cast)

静态转换是将一种数据类型的值强制转换为另一种数据类型的值。

静态转换通常用于比较类型相似的对象之间的转换,例如将 int 类型转换为 float 类型。

静态转换不进行任何运行时类型检查,因此可能会导致运行时错误。

实例

int i = 10; 
float f = static_cast<float>(i); // 静态将int类型转换为float类型

动态转换(Dynamic Cast) 

动态转换通常用于将一个基类指针或引用转换为派生类指针或引用。动态转换在运行时进行类型检查,如果不能进行转换则返回空指针或引发异常。

实例

class Base {};
class Derived : public Base {};
Base* ptr_base = new Derived;
Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base); // 将基类指针转换为派生类指针

常量转换(Const Cast)

常量转换用于将 const 类型的对象转换为非 const 类型的对象。

常量转换只能用于转换掉 const 属性,不能改变对象的类型。

实例

const int i = 10; 
int& r = const_cast<int&>(i); // 常量转换,将const int转换为int

重新解释转换(Reinterpret Cast)

重新解释转换将一个数据类型的值重新解释为另一个数据类型的值,通常用于在不同的数据类型之间进行转换。

重新解释转换不进行任何类型检查,因此可能会导致未定义的行为。

实例

int i = 10; 
float f = reinterpret_cast<float&>(i); // 重新解释将int类型转换为float类型

函数参数默认值 

当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。

这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。请看下面的实例:

#include <iostream>
using namespace std;int sum(int a, int b=20)
{int result;result = a + b;return (result);
}int main ()
{// 局部变量声明int a = 100;int b = 200;int result;// 调用函数来添加值result = sum(a, b);cout << "Total value is :" << result << endl;// 再次调用函数result = sum(a);cout << "Total value is :" << result << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Total value is :300 
Total value is :120

C++ 字符串 

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串

  • C++ 引入的 string 类类型

C 风格字符串,略。

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

#include <iostream>
#include <string>using namespace std;int main ()
{string str1 = "runoob";string str2 = "google";string str3;int  len ;// 复制 str1 到 str3str3 = str1;cout << "str3 : " << str3 << endl;// 连接 str1 和 str2str3 = str1 + str2;cout << "str1 + str2 : " << str3 << endl;// 连接后,str3 的总长度len = str3.size();cout << "str3.size() :  " << len << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

str3 : runoob 
str1 + str2 : runoobgoogle 
str3.size() : 12

C++ 引用

引用变量其实是取一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同: 不存在空引用。引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 C++ 中创建引用 试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。

例如:

int i = 17;

我们可以为 i 声明引用变量,如下所示:
 

int& r = i;double& s = d;

在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。

下面的实例使用了 int 和 double 引用:

#include <iostream>using namespace std;int main ()
{// 声明简单的变量int    i;double d;// 声明引用变量int&    r = i;double& s = d;i = 5;cout << "Value of i : " << i << endl;cout << "Value of i reference : " << r  << endl;d = 11.7;cout << "Value of d : " << d << endl;cout << "Value of d reference : " << s  << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of i : 5 
Value of i reference : 5 
Value of d : 11.7 
Value of d reference : 11.7

引用通常用于函数参数列表和函数返回值。下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念:

搞个引用有啥用?

参考:深入浅出C++引用(Reference)类型 - micemik - 博客园 (cnblogs.com)

要点1:为反复使用的冗长的变量名称定义一个简短的、易用的别名,从而简化了代码。通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象。

要点2:声明(定义)之后,无法再次指定作为其它变量的别名。

C++ 基本的输入输出

C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。

C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作

I/O 库头文件

下列的头文件在 C++ 编程中很重要。

标准输出流(cout)

预定义的对象 coutiostream 类的一个实例。cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>using namespace std;int main( )
{char str[] = "Hello C++";cout << "Value of str is : " << str << endl;
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of str is : Hello C++

C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值。<< 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。

流插入运算符 << 在一个语句中可以多次使用,如上面实例中所示,endl 用于在行末添加一个换行符。

<<是个可重载的运算符,叫做流插入运算符,形象解释就是,想要输出啥,就往cout上输出即可。

比如:

输出结果如下:

所见即所得,输出时不需要使用什么符号来指定数据类型。

标准输入流(cin)

预定义的对象 ciniostream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用的,如下所示:

#include <iostream>using namespace std;int main( )
{char name[50];cout << "请输入您的名称: ";cin >> name;cout << "您的名称是: " << name << endl;}

当上面的代码被编译和执行时,它会提示用户输入名称。当用户输入一个值,并按回车键,就会看到下列结果:

请输入您的名称: cplusplus 
您的名称是: cplusplus

C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中。

流提取运算符 >> 在一个语句中可以多次使用,如果要求输入多个数据,可以使用如下语句:

cin >> name >> age;

这相当于下面两个语句:

cin >> name; 
cin >> age;

标准错误流(cerr)

预定义的对象 cerriostream 类的一个实例。cerr 对象附属到标准输出设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出。

cerr 也是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>using namespace std;int main( )
{char str[] = "Unable to read....";cerr << "Error message : " << str << endl;
}

当上面的代码被编译和执行时,它会产生下列结果:

Error message : Unable to read....

标准日志流(clog)

预定义的对象 clogiostream 类的一个实例。clog 对象附属到标准输出设备,通常也是显示屏,但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。

clog 也是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>using namespace std;int main( )
{char str[] = "Unable to read....";clog << "Error message : " << str << endl;
}

当上面的代码被编译和执行时,它会产生下列结果:

Error message : Unable to read....

通过这些小实例,我们无法区分 cout、cerr 和 clog 的差异,但在编写和执行大型程序时,它们之间的差异就变得非常明显。所以良好的编程实践告诉我们,使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出。

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

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

相关文章

Java中类装载的执行过程

类装载的执行过程 类从加载到虚拟机中开始&#xff0c;直到卸载为止&#xff0c;它的整个生命周期包括了&#xff1a;加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中&#xff0c;验证、准备和解析这三个部分统称为连接&#xff08;linking&#xff09;。 1.加载 …

学习记录(9):Prompt提示词技巧

依旧照例先感谢前辈们的慷慨分享 今天学习的是这篇文章↓ 原文&#xff1a;转自公主号“博金斯的AI笔记” —《4篇Prompt论文的提示词技巧, 3 个 GPTs 实例测试》 文章目录 一、提示词框架二、逻辑链&#xff08;Chain of thought&#xff09;三、思维树&#xff08;Tree of th…

[渗透测试学习] PermX-HackTheBox

文章目录 PermX-HackTheBox信息搜集漏洞利用权限提升参考文章PermX-HackTheBox 信息搜集 nmap扫描一下端口 nmap -sC -v 10.10.11.23扫描结果如下 PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: | 256 e2:5c:5d:8c:47:3e:d8:72:f7:b4:80:03:49:86:6d:ef (ECDSA…

二维码直达App,Xinstall为你打通运营任督二脉

在移动互联网时代&#xff0c;App的推广和运营显得尤为重要。然而&#xff0c;许多企业在投入大量资源进行App推广和运营时&#xff0c;总会遇到一些棘手的问题&#xff0c;如用户转化率低、数据分析困难等。今天&#xff0c;我们要为大家揭秘一个神奇的助手——Xinstall&#…

Github2024-07-29 开源项目周报Top15

根据Github Trendings的统计,本周(2024-07-29统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目2Java项目2HTML项目2C项目2TypeScript项目2JavaScript项目2非开发语言项目1Vue项目1Go项目1Dart项目1C++项目1Rust项目1Jupyter Note…

【Linux】-----进度条小程序

目录 前言 基本知识 Ⅰ、回车和换行 Ⅱ、缓冲区 两个有意思的现象 简单定义 刷新缓冲区 简易倒计时程序 进度条代码 多文件下makefile写法 一代(无任何场景) procs1.h代码 procs1.c代码 主函数main1.c 一代运行结果&#xff1a; 二代 (搭配下载场景) procs2.c代…

在jmeter中使用javascript脚本

工作上遇到一个压力测试的需求&#xff0c;需要测试几个考试相关的接口。其中有一个获取试题详情的接口&#xff0c;和一个提交答题信息的接口。后一个接口以上一接口的返回内容为参数&#xff0c;添加上用户的答案即可。jmeter提供了非常多的方式可以实现该需求&#xff0c;这…

MySQL分组查询有关知识总结

目录 4. 分组查询&#xff08;group by&#xff09; 4.1 概述 4.2 分组函数 4.2.1 单个使用 4.2.2 组合使用 4.2.3 注意&#xff01; 4.3 group by 4.3.1 单个字段 4.3.2 多个字段 4.3.3 提醒&#xff01; 4.4 having 4.5 分组查询演示 4. 分组查询&#xff08;…

稀疏矩阵和稠密矩阵

1.csr_matrix compress sparse row&#xff0c;因此csr是按行压缩的稀疏矩阵。 稀疏矩阵由于0值过多&#xff0c;仅记有值的矩阵位置索引&#xff0c;如下图打印所示。 更多矩阵介绍参考这篇博文【Scipy学习】Scipy中稀疏矩阵用法解析&#xff08;sp.csr_matrix&#xff1b;s…

国家网络身份个人认证方法

申领网络身份认证后&#xff0c;用户会得到一张虚拟的“网络身份证”&#xff0c;它可以向需要实名认证的互联网平台进行认证&#xff0c;不再需要输入姓名和身份证号等信息。 申请方式&#xff1a;各手机应用平台搜索国家网络身份认证即可&#xff08;必须支持NFC才能申请&am…

大模型三种模式Embedding、copilot、Agent

大模型的三种应用模式——Embedding、Copilot、Agent——代表了不同级别的智能化和自动化程度&#xff0c;以及与人类用户的交互方式。下面是每种模式的具体解释&#xff1a; 嵌入模式&#xff08;Embedding Mode&#xff09; 定义&#xff1a;在嵌入模式中&#xff0c;大模型…

每日一题——贪心算法

1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 一开始有点理解错他的意思&#xff0c;以为是i是题目中会给出&#xff0c;所以一开始没有什么思路&#xff0c;然后当看了题解之后&#xff0c;就知道了原来i是自己订的&#xff0c…

认识经典蓝牙

现在BLE很流行&#xff0c;本人接触BLE也更多&#xff0c;而对经典蓝牙BR/EDR的开发知之甚少&#xff0c;而且网上关于经典蓝牙的资料也很少&#xff0c;所以&#xff0c;想要有更多了解。 参考&#xff1a; https://www.nordicsemi.cn/news/bluetoothle-and-bluetoothclassic/…

网页设计师必备!10个免费的设计素材网站推荐

当网页设计师使用网页设计材料时&#xff0c;他们会优先考虑那些免费和高质量的网页设计材料网站。找到一个免费和高质量的网页设计材料网站并不容易&#xff0c;有些网站要么需要打开材料网站成员&#xff0c;要么设计材料质量很差。即时设计总结了10个免费的网页设计材料网站…

WEB服务器的详解与部署

WEB服务器也称为网页服务器或HTTP服务器 WEB服务器使用的协议是HTTP或HTTPS HTTP协议默认端口号&#xff1a;TCP 80 HTTPS协议默认端口号&#xff1a;TCP 443 浏览器其实就是 HTTP 客户端 WEB服务器发布软件 微软&#xff1a;IIS(可以发布web网站和FTP站点)linux&#x…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备 ​ 大家好&#xff0c;因为板端BPU环境&#xff0c;可以加速目标检测的速度&#xff0c;所以今天在此先给大家带来如何准备一个模型&#xff0c;下一期会给大家带来如何在板端部…

PromQL全方位解读:监控与性能分析的关键技术

一、PromQL简介 Prometheus Query Language (PromQL) 是一个专为Prometheus监控系统设计的强大查询语言&#xff0c;它允许用户对收集的时间序列数据进行高效、灵活的查询和分析。PromQL的设计哲学在于提供简洁而强大的语法&#xff0c;以支持复杂的数据检索和实时监控场景。本…

7B 开源模型突破 IMO 形式化证明,霸榜数学竞赛

总览 去年底&#xff0c;著名数学家、菲尔兹奖获得者陶哲轩就提出 AI 将加速数学研究&#xff0c;成为数学家的可靠伙伴&#xff0c;并且在形式化语言 Lean 的帮助下&#xff0c;成功证明了多项式 Freiman-Ruzsa 猜想。在今年的国际数学奥林匹克竞赛&#xff08;IMO&#xff0…

24澳中博览会|2025非洲水协年会暨展览|2025山西水展

2024澳中博览会 2025非洲水协年会暨展览 2025年山西国际水展暨水利工程设计与施工、水处理技术设备、泵管阀、智慧水务及环保展 承办单位&#xff1a;山西泽嘉国际展览有限公司 上海泽嘉展览服务有限公司 战略合作伙伴 &#xff1a; 美国迈阿密水展 欧 洲 海 水 脱 盐 淡 化…

新版Next.js 15中5个令人惊叹的特性

前端岗位内推来了 Next.js 15已经到来&#xff0c;一切比以往更好&#xff01; 从全新的编译器到700倍更快的构建时间&#xff0c;创建具有卓越性能的全栈Web应用从未如此简单。 让我们探索v15的最新特性&#xff1a; 1. create-next-app升级&#xff1a;更清晰的UI&#xff0c…