当前位置: 首页 > article >正文

C++:入门详解(关于C与C++基本差别)

目录

一.C++的第一个程序

二.命名空间(namespace)

1.命名空间的定义与使用:

(1)命名空间里可以定义变量,函数,结构体等多种类型

(2)命名空间调用(::)与展开

(3)命名空间的嵌套

(4)具体使用场景

三.缺省参数

1.基本定义:

2.几个注意:

四.函数重载

1.定义与使用:

五.引用

1.定义:

2.引用的特性:

3.引用的使用(区别传值返回和传引用返回):

4.const引用:

六.inline内联


一.C++的第一个程序

C++作为C语言的升级版,除了可以无缝兼容C语言的各种语法结构和各种框架外,在很大程度上对C语言的许多代码进行了优化升级,在保持原有代码逻辑结构相同的情况下,C++的简便性和应用性相比C语言不可同日而语,以下我要阐述的就是在学完C语言然后进入C++后需要掌握的一些基础知识首先来看第一个C++程序

#include<iostream>//C++需要包含的头文件
using namespace std;//展开对应的命名空间
int main()
{cout << "hello world" << endl;//区别于C语言的输出方式
//cout<<输出内容,后面的endl是换行(endline),但和C语言里面的\n不用,endl是一个函数。return 0;
}

基础结构大概就是这样,下面就是对每一部分的具体介绍:

二.命名空间(namespace)

1.命名空间的定义与使用:

书面上的定义简而言之是:namespace的本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量

(1)命名空间里可以定义变量,函数,结构体等多种类型
#include<iostream>
namespace space
{
//定义变量int rand = 10;char time = 20;
//定义函数int add(int a, int b){return a + b;}
//定义结构体struct student{char name[20];char sex[6];int age;};
}
int main()
{return 0;
}
(2)命名空间调用(::)与展开

 在调用的时候,只要用空间名::函数名这样的格式来调用

#include<iostream>
int main()
{std::cout << "hello world" << std::endl;return 0;
}

 也可以只展开一个命名空间中的某个变量或函数,这样的话访问这个变量或函数就更简便

#include<iostream>
using namespace std;
namespace b
{int test(int x, int y){return x + y;}
}
using b::test;
int main()
{int m = test(1, 5);cout << m;return 0;
}
(3)命名空间的嵌套
#include<iostream>
using namespace std;
namespace a
{int test(int x, int y){return x + y;}namespace b{int test(int x, int y){return x * y;}}}
int main()
{int m = a::test(2, 3);int n = a::b::test(2, 3);cout << m << " " << n;return 0;
}
(4)具体使用场景
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数” printf("%d\n", rand);return 0;
}

这样写c语言会报错:报错的原因就是我们自己定的变量rand和C语言自带的库函数冲突了,这时候编译器就无法识别,这其实是C语言的不足之处。而c++中的命名空间就完美的解决这个问题

三.缺省参数

1.基本定义:

在函数定义时为参数指定的默认值,当调用函数时如果没有传递该参数,则使用默认值。这样可以提高函数的灵活性和可重用性
举例例如一个计算面积的函数,参数有长和宽,其中宽可以设为默认值1,这样调用时只传长就可以得到正方形的面积,这样的例子比较直观

#include<iostream>
using namespace std;
int test(int x = 2, int y = 6)
{return x + y;
}
//如果调用这个函数但是不传递参数,那么返回结果就是8,同样如果掺入参数1和2,那么返回结果就是3

2.几个注意:

(1)缺省参数必须从右往左给,比如上面的程序,我们只给x缺省参数但不给y缺省参数这样其实是不合法的  

(2)函数实参一定是从左往右给函数的

(3)函数声明和定义分离时,不能在声明和定义中同时给缺省值

#include<iostream>
using namespace std;int test(int x = 1, int y = 2);
int main()
{int a = test();cout << a;return 0;
}
int test(int x = 1, int y = 2)
{return x + y;
}
//比如这样同时个给缺省值的函数是不合法的,一般只在声明中给缺省值

四.函数重载

1.定义与使用:

即重名函数可以通过识别传入的参数类型来自动选择相对应的函数,例如:

#include<iostream>
using namespace std;int test(int x , int y )
{return x + y;
}
double test(double x, double y)
{return x + y;
}
int main()
{double x = 1.5, y = 2.8;int a = test(1,2);double b = test(x, y);cout << a <<" "<< b ;return 0;
}

五.引用

1.定义:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间,但实际上在C++的底层逻辑里引用依旧是以指针的形式存在,但我们在实际使用中并不需要考虑那么多,就当引用是C++给我们带来的一种更加方便写代码的方法就行了,以下是引用使用的基本规则:

类型& 引用别名=引用对象

#include<iostream>
using namespace std;
int main()
{int a = 30;//一个变量可以取多个别名int& b = a;//给a变量取别名int& c = a;//c也是a的别名int& d = b;//给b变量取别名,相当于d也是a的别名cout << &a << endl << &b << endl << &c << endl << &d << endl;//从地址中也可以看出来a,b,c,d占用同一块内存空间return 0;}

当然,引用相对指针是非常方便好理解的,我举个例子:

#include<iostream>
using namespace std;
//传址调用,指针
void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
//引用
void swap(int& a, int& b)//函数重载
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 10;int b = 20;swap(a, b);swap(a, b);return 0;
}

2.引用的特性:

(1)引用必须在定义时初始化。比如int& a=0;这句代码其实是不合法的

(在 C++ 中,引用必须在定义时初始化,这意味着当声明一个引用变量时,必须立即将其绑定到一个已存在的对象(变量、常量或表达式的结果),与普通变量不同,普通变量可以在后续赋值时初始化)

(2)一个变量可以有多个引用

(3)引用一旦引用一个实体,再不能引用其他实体

举个栗子:

#include<iostream>
using namespace std;int main()
{int a = 10;int& b = a;int c = 20;b = c;cout << &a <<" "<< &b <<" "<< &c << endl;cout << a <<" "<< b <<" "<< c << endl;return 0;
}
//这里进行了b=c的操作,只是把c的值赋值给了b,但并没有改变b的引用实体,因此a和b地址是相同的

3.引用的使用(区别传值返回和传引用返回):

引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被 引用对象

引用传参介绍过了,然后我们看一下引用做返回值(即传引用返回)与传值返回区别

int STTop(ST& rs)//注意这里是传值返回(因为返回类型是int二百元引用类型的int&)
{assert(rs.top > 0);return rs.a[rs.top];
}
int main()
{ST st1;STInit(st1);STPush(st1, 1);//入栈STPush(st1, 2);STTop(st1)+=10;return 0;
}

截取了一部分之前栈的操作,发现对于STTop(st1)+=10;这个操作无法达到目的,

我们本意想的是让栈顶的数据加上10,但是实际上栈顶的数据并没有改变     

这是因为这串代码返回的是一个值,相当于我们把原来的数拷贝出了他的值然后返回了,

因此就算把这份拷贝的值加上10也无法改变原来的栈顶数据

以上发生的情况就是由传值引用引发的,传值引用简而言之就是为了保护源数据不被修改的场景二存在,通过返回对栈顶元素的值的拷贝,从而使实际上的栈顶元素不受改变

但如果代码这样改,就可以轻易改变栈顶元素的值:

(即传引用返回)

int& STTop(ST& rs)
{assert(rs.top > 0);return rs.a[rs.top];
}
int main()
{ST st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);STTop(st1)+=10;return 0;
}

4.const引用:

const引用简而言之就是对引用范围的缩小:即  const对象必须用const引用,普通对象也可以用const引用,但普通引用引用不了const对象

#include<iostream>
using namespace std;
int main()
{const int a = 10;//只可读//int& b = a;//发生错误,b可读可写,权限变大//应加上const const int& b = a;int c = 20;const int& d = c;//权限缩小,可以c++;//d++不可以;c可以改变,d不可以return 0;
}

 这些就涉及到权限的问题,普通对象是一个变量,可以被改变的,所以他的权限更低。而const对象不能被改变所以他的权限更高。普通引用引用const对象权限就放大了,所以编译器会报错,反过来const引用可以引用普通对象,因为权限是可以缩小的,总结来说:访问权限可以缩小,但是不能放大(访问权限只针对引用和指针)

六.inline内联

在 C++ 中,内联函数(Inline Functions)是一种优化机制,旨在通过在编译时将函数体直接替换到调用位置,减少函数调用的开销(如栈帧压入/弹出、参数传递等)

#include<iostream>
using namespace std;
inline int add(int x,int y)
{return x + y;
}
int main()
{cout << add(1, 5) << endl;return 0;
}

对于短小的函数,inline操作会使函数在编译时展开,可以提高效率。但是如果这个函数过长就不适合使用内联了,过长的函数内联反而会降低时间,因此,内联函数也并不是万能的

    还有一点非常值得注意,就是内联函数的定义和声明必须在同一个文件

欧克了,C++的入门知识大概就是这些了,相比C语言,还是由很多需要管制与在意的地方,那就先这样吧

全文终

相关文章:

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间&#xff08;namespace&#xff09; 1.命名空间的定义与使用&#xff1a; &#xff08;1&#xff09;命名空间里可以定义变量&#xff0c;函数&#xff0c;结构体等多种类型 &#xff08;2&#xff09;命名空间调用&#xff08;&#xf…...

GC安全点导致停顿时间过长的案例

GC安全点导致停顿时间过长的案例 前言安全点的概念案例分析解决方法如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 前言 前段时间在使用G1垃圾收集时&#xff0c;因服务读写压力过大&#xf…...

linux下 jq 截取json文件信息

背景&#xff1a;通过‘登录名‘ 获取该对象的其他个人信息如名字。 环境准备&#xff1a;麒麟操作系统V10 jq安装包 jq安装包获取方式&#xff1a;yum install jq 或 使用附件中的rpm 或 git自行下载 https://github.com/stedolan/jq/releases/download/ 实现过程介绍&am…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09; 是最佳解决方案。以下是详细步骤&#xff1a; 一、安装 Git LFS 下载并安装 Git LFS&#xff1a; 访问 Git LFS 官网 下载对应系统的安装包。或…...

躲藏博弈:概率论与博弈论视角下的最优策略选择

躲藏博弈&#xff1a;概率论与博弈论视角下的最优策略选择 1. 问题引入 想象这样一个场景&#xff1a;你在厕所里藏了一部手机&#xff0c;一周过去了&#xff0c;它仍未被发现。现在你面临一个决策&#xff1a; 选项A&#xff1a;继续将手机留在原处选项B&#xff1a;将手机…...

类加载器加载过程

今天我们就来深入了解一下Java中的类加载器以及它的加载过程。 一、什么是类加载器&#xff1f; 在Java中&#xff0c;类加载器&#xff08;Class Loader&#xff09;是一个非常重要的概念。它负责将类的字节码文件&#xff08;.class文件&#xff09;加载到Java虚拟机&#x…...

Python中dump、dumps和load、loads的异同

Python中dump、dumps和load、loads的异同 Python中dump、dumps和load、loads的异同 1. json.dump()和json.dumps() 1.1 json.dump()1.1 json.dumps() 2. json.load()和json.loads() 2.1 json.load()2.2. json.loads() 3. 总结对比4. 区分5. 完整代码 1. json.dump()和json.dum…...

Spring Boot整合ArangoDB教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、环境准备 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11&#xff08;本地安装或Docker运行&#xff09; Docker启动ArangoDB docker run -d --name ar…...

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示&#xff0c;但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图&#xff0c;这是为什么&#xff1f;我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新&#xff0c;单当视图中不存在…...

软件工程:软件需求之需求分析方法

目录 前言 需求分析方法 工具和方法 具体分析方法 对运行环境的影响 ​编辑 前言 本文重点介绍开展软件需求分析的方法。 需求分析方法 工具和方法 软件需求可以维护在ALM系统中&#xff0c;譬如&#xff1a;doors&#xff0c;codeBeamer等&#xff0c;JIRA适合互联网行…...

【网络编程】WSAAsyncSelect 模型

十、基于I/O模型的网络开发 接着上次的博客继续分享&#xff1a;select模型 10.8 异步选择模型WSAAsyncSelect 10.8.1 基本概念 WSAAsyncSelect模型是Windows socket的一个异步I/O 模型&#xff0c;利用这个模型&#xff0c;应用程序 可在一个套接字上接收以Windows 消息为基…...

视觉-语言模型-出发点CLIP--(精读论文)

阅读建议&#xff1a;配合这个源码分析阅读效果更加 研究背景和目的 介绍当前计算机视觉系统依赖固定类别标签训练的局限性&#xff0c;以及自然语言监督作为一种有潜力替代方式的研究现状。强调论文旨在探索从自然语言监督中学习可迁移视觉模型&#xff0c;实现零样本学习&a…...

docker本地部署RagFlow

1.安装 克隆仓库 git clone https://github.com/infiniflow/ragflow.git构建预建的Docker映像并启动服务器 cd ragflow/docker chmod x ./entrypoint.sh docker compose -f docker-compose.yml -p ragflow up -d修改ragflow/docker/.env文件 #RAGFLOW_IMAGEinfiniflow/ragfl…...

机器学习数学基础:44.多元线性回归

一、文字内容详解 1. 多重共线性的判断——皮尔逊相关系数 皮尔逊相关系数用于衡量自变量间的线性相关程度&#xff0c;取值范围为 ([-1, 1])&#xff1a; 绝对值越接近 (1)&#xff0c;变量间线性相关性越强&#xff1b;越接近 (0)&#xff0c;相关性越弱。在多重共线性判断…...

GetWindowLongPtr函数分析

第一部分&#xff1a; #ifdef UNICODE FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrW, HWND, hwnd, int, nIndex) #else FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrA, HWND, hwnd, int, nIndex) #endif // UNICODE LONG_PTR APIENTRY GetWin…...

大语言模型(LLM)和嵌入模型的统一调用接口

ChatModelFactory、EmbeddingModelFactory 讲解代码&#xff1a;import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…...

大白话html语义化标签优势与应用场景

大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局&#xff0c;但是<div>本身没有什么实际的含义&#xff0c;就像一个没有名字的盒子。而语义化标签就像是有名…...

Scala:在哪里写类的属性?类的属性必须私有吗?类的必须初始化吗?

哪里写类的属性 直接在类体中定义属性 class Circle {private var _radius: Double 0.0def radius: Double _radiusdef radius_(newRadius: Double): Unit {_radius newRadius}def area: Double scala.math.Pi * _radius * _radius } 可以在类体内部直接定义属性。例如&am…...

Android源码编译命令详解

一、引言 先看下面几条指令&#xff0c;相信编译过Android源码的人都再熟悉不过的。 source setenv.sh lunch make -j8记得最初刚接触Android时&#xff0c;同事告诉我用上面的指令就可以编译Android源码&#xff0c;指令虽短但过几天就记不全或者忘记顺序&#xff0c;每次编…...

任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…...

Unity之如何实现哔哩哔哩直播弹幕游戏

前言 什么是直播间互动? 当我们使用哔哩哔哩进行直播或者观看视频时,我们可以通过接入哔哩哔哩提供的 直播&互动玩法SDK,让直播和视频可以与Unity3D游戏客户端或者游戏服务器进行互动。 环境要求 Unity 2020.x或更高版本 依赖库:Newtonsoft Json Unity Package 在P…...

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...

LeeCode题库第四十六题

46.全排列 项目场景&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&am…...

LangChain4j开发RAG入门示例

本文将详细介绍如何基于Java语言&#xff0c;使用Langchain4j开源框架、Milvus向量数据、阿里Qwen大模型&#xff0c;开发一个RAG入门级简单示例。本示例虽然简单&#xff0c;但涉及到多个知识点&#xff0c;包括&#xff1a;Milvus初始化、Embedding模型、文档切片、Springboo…...

快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载

&#x1f4dd;前言&#xff1a; 本文章适合有一定C语言编程基础的读者浏览&#xff0c;主要介绍从C语言到C过度&#xff0c;我们首先要掌握的一些基础知识&#xff0c;以便于我们快速进入C的学习&#xff0c;为后面的学习打下基础。 这篇文章的主要内容有&#xff1a; 1&#x…...

课程《Deep Learning Specialization》

在coursera上&#xff0c;Deep Learning Specialization 课程内容如下图所示&#xff1a;...

微服务与消息队列RabbitMQ

简介 同步模式 异步模式 内容 解决方案RabbitMQ 同步调用的优缺点 同步调用的优势是什么&#xff1f; 时效性强&#xff0c;等待到结果后才返回。 同步调用的问题是什么&#xff1f; 拓展性差性能下降级联失败问题...

苹果 M3 Ultra 芯片深度解析:AI 时代的性能革命

2025 年 3 月 5 日&#xff0c;苹果正式发布了其史上最强 PC 芯片 ——M3 Ultra。这款基于 UltraFusion 封装技术的旗舰级 SoC&#xff0c;不仅延续了苹果芯片在能效比上的传统优势&#xff0c;更通过架构创新与硬件升级&#xff0c;将 AI 计算能力推向了新高度。本文将从性能突…...

通义千问:Qwen2.5-0.5B模型架构解释

通义千问:Qwen2.5-0.5B模型架构解释 1. 模型权重文件 .mdl、.msc:存储模型核心参数,是模型训练后学习到的知识载体,包含神经网络各层权重,加载后模型才能执行推理、生成等任务。 .mdl文件:通常是模型的核心权重数据文件,存储神经网络各层的权重参数、张量等关键数据,是…...

安装完flash-attn,使用时报错undefined symbol

去flash attention官网下载安装包, 注意需要根据自己的torch版本,cuda版本(可以选择低于自己cuda版本的) 和python版本进行选择。 如果whl文件名上包含参数abiTRUE&#xff0c;则会报错。需要安装包含abiFALSE的whl文件。 卸载&#xff1a;卸载原先报错的flash-attn pip uni…...