从零开学C++:入门

引言:经过C语言数据结构等编程知识的洗礼,到了暑假,我们就将要踏上C++编程语言的学习了,C++的学习难度比python等其他语言的学习难度更大,但是我们已经熟练地掌握了C语言的知识,相信学习起来C++应该还是会简单许多。那么,今天就让我们踏上C++的学习之路吧!

更多有关C语言数据结构的知识详解可前往个人主页:计信猫

一,C++关键字——namespace 

1,引子 

        让我们先看下面一段代码:

#include<stdio.h>
#include<stdlib.h>
//定义一个全局变量rand=10
int rand = 10;
int main()
{//打印rand的值printf("%d\n", rand);return 0;
}

         在代码运行之后,我们的预期结果是控制台上成功打印10,。但是代码一走,却出现了如下的情况:

        那么这段看似“完美无瑕”的代码又错在哪里了呢?其实答案很简单,在我们包含的头文件<stdlib.h>当中,就含有一个以rand来命名的函数,而当我们定义一个同名的全局变量rand的时候,就会造成歧义,导致编译器无法分辨rand变量还是函数。 

        那么我们有没有什么办法来解决这个问题呢?当然,C++就为我们提功了一个很好的解决办法,那就是关键字——namespace

2,命名空间的定义

        定义命名空间,就需要使用到namespace关键字,只需要关键字后面跟空间的名字,再接上一对{}即可,而{}中就可以存放成员变量的名字(变量可以为函数,变量,类型等)

        那么namespce关键字的使用就可以如下:

namespace test//该命名空间的名字为test
{//变量int rand = 10;//函数int Add(int a, int b){return a + b;}//类型struct node{int val;struct node* next;};
}

        当然与此同时,namespace关键字也同时支持嵌套定义

namespace n1
{namespace n2{//……成员}
}

        并且,在不同的文件当中,同一个名称的命名空间可以被合并!如下:

//test.cpp文件当中
namespace n1
{//函数的定义int Add(int a, int b){return a + b;}
}
//test.h文件当中
namespace n1
{//函数的声明int Add(int a, int b);
}

3,命名空间的使用 

         那么,我们定义好了一个命名空间了,此时我们又应该使用什么方式去使用命名空间里边的成员呢?

方式一:

        此时我们就需要用到预作用限定符——::,在使用时,我们只需要套用以下格式即可完成命名空间的成员的访问。形式如下:

命名空间名::命名空间成员名

        所以,当我们遇到引子中所提到的问题时,我们就可以使用学得到知识很好地解决:

#include<stdio.h>
#include<stdlib.h>
//定义一个全局变量rand=10
namespace test
{//变量int rand = 10;
}
int main()
{//打印rand的值printf("%d\n", test::rand);//使用::return 0;
}

        代码一走,结果如下:

方式二:

        如果觉得某一个成员变量的使用次数很多,每一次使用该变量时觉得“::”非常的麻烦,那么我们可以使用using将某个成员变量的引入 ,这样就可以很好的避免以上的问题:

#include<stdio.h>
#include<stdlib.h>
namespace test
{//变量int a = 10;
}
//使用using引入成员变量
using test::a;
int main()
{//打印a的值printf("%d\n", a);return 0;
}

方式三:

        我们也可以使用using直接将一整个命名空间展开这时候使用命名空间里边的任何一个成员都不需要使用域作用限定符了!

#include<stdio.h>
#include<stdlib.h>
namespace test
{//变量int a = 10;//函数int Add(int a, int b){return a + b;}
}
//使用using展开命名空间
using namespace test;
int main()
{//打印a的值printf("%d\n", a);int c = Add(10, 20);printf("%d\n", c);return 0;
}

二,C++输出&输入

        C++中输出和输入分别对应着cout(标准输出流对象——控制台)cin(标准输入流对象——键盘),他们的作用分别相当于printf和scanf。因为它们的实现方式都存在于<iostream>头文件中的std命名空间当中,所以使用它们的时候都必须包含头文件<iostream>,并且以前面所学到的空间命名使用方式使用std

        在C++中,endl也包含于头文件<iostream>中,它的作用是换行。<<流插入运算符>>流提取运算符。与C语言不同的是,在输入和输出时,C++可以自动识别变量类型

        那么现在,就让我们使用C++完成对变量的赋值和打印吧。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{int a;double b;char c;cout << "请输入abc的值" << endl;//分别对abc赋值cin >> a >> b >> c;cout << "abc的值如下" << endl;//打印abc的值cout << a << endl << b << endl << c << endl;return 0;
}

        代码一走,结果如下:

 三,缺省参数

1,缺省参数的概念

        当我们在声明或者定义一个函数时,我们给该函数的参数一个缺省值。如果在使用该函数时,该参数没有对应的实参值,那么函数就会默认采用它的缺省值运行。

        让我们来看一个例子:

//我们给10为缺省值
void func(int a = 10)
{cout << a << endl;
}
int main()
{func();//我们没有给该函数传参,所以函数将使用缺省值运行return 0;
}

        代码一走,10就被打印在了控制台上。

  2,缺省参数的分类

        缺省参数可以被分为两类,一个是全缺省,另一个是半缺省

全缺省

//全缺省
void Add(int a=1,int b=3,int c=0);

半缺省

//半缺省
void Add(int a,int b=3,int c=0);

        其中,半缺省规定:只可以从右向左连续进行缺省,不可以有间隔。而在缺省参数这一整个知识点当中,还有一个规定,那就是缺省参数不可以同时出现在函数的声明和定义当中,缺省参数最好还是在函数的声明当中给出

四,函数重载

        在C++当中,函数可以拥有相同的名字,但是参数必须不同(参数的类型,个数,顺序)

//参数类型不同
int Add(int a, int b);
double Add(double a, double b);//参数个数不同
void func(int a);
void func();//参数顺序不同
void Print(int a, char b);
void Print(char b, int a);

        但是,返回值不同,但是参数相同的情况下是不会构成重载函数,编译器会报错。

五,引用

1,引用的概念

        在《水浒传》中,李逵在家中被称为“铁牛”,江湖上人称“黑旋风”,而这些称谓全都是指一个人——李逵

        所以在C++当中,引用就相当于给变量取了许多别名引用的形式如下:

 类型& 引用变量名(对象名)=引用实体名;

        那么我们可以用以下例子来加强我们的理解:

int main()
{int a = 1;//开始引用int& b = a;int& c = a;int& d = b;++d;//打印各个变量的值cout << a << ' ' << b << ' ' << c << ' ' << d << endl;return 0;
}

         那么代码一走,结果如下:

        所以由此我们可以看出,bcd变量全部都是a的别名,只要其中一个变化,那么其他的也会跟着变化! 

2,引用的作用

        有了引用这个功能之后,那么我们就可以很轻松的写出以前的Swap交换变量函数

//交换函数
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}

        其中的形参ab其实就是实参的引用

        而以前的二级指针也可以进行如下的表示:

LTNode** pphead—— > LTNode*& phead;

        所以,引用主要用于函数的返回值和传参,使程序效率更高并且改变引用和被引用对象。 

3,const引用

        const引用主要作用于函数的参数传递,会与后面我们会学到的知识产生紧密的关联。而在使用const引用的时候,我么都必须遵守一个规则:权限只可缩小,不可放大。那么这句话具体指什么意思呢?让我们通过以下的例子来进行讲解:

    const int a = 1;
    //语句一
    int& b = a;
    //语句二
    const int& c = a;

        那么在这个例子当中,哪一条语句是正确的呢? 其实正确的语句是语句二,因为当我们以const修饰了整型变量a的时候,那么a此时的权限就是只可读,不可写。第一条语句的b引用变量却没有const修饰,那么此时的b就表示可读可写相当于被引用变量a发生了权限放大,则发生了错误。

        那么以下的例子也有着它们对应的错误,我们进行讲解:

    //示例一
    int b = 10;
    const int& rb = b;//正确,因为rb有const修饰,只可读不可写,相当于b发生了权限缩小
    //示例二
    int a = 1;
    int b = 2;
    int& c = (a + b);//错误,因为(a+b)被视为一个临时对象,具有常量属性,只可读不可写,此处发生权限的放大
    const int& d = (a + b);//正确,等号左右权限相同
    //实例三
    double d = 13.14;
    int i = d;
    int& ri = d;//错误,因为两变量类型不同
    const int& ti = d;//正确,因为d类型转换为整型,此时就产生了d的整型临时对象,有常量属性

4,引用的规则

        1,引用必须初始化。

    int i = 0;
    int& ri = i;//正确
    int& bi;//错误,必须将bi初始化

        2,可以给别名取别名。 

    int i = 0;
    int& ri = i;
    int& bi=ri;//给别名ri取别名为bi,它们都表示i

        3,引用一旦引用一个实体,就不可以引用其他实体。 

    int i = 0; 
    int j = 0;
    int& ri = i = j;//此时ri++,则j不会发生变化

        4,引用不会开辟额外空间,指针会开辟额外空间。

        5,sizeof中,引用的结果为引用类型的大小。 

六,inline内联

        inline内联可以算得上是一种对的替换。假如当我们想使用实现一个加法函数时,我们很容易发生少打了括号,多大了分号的错误,而inline内联很好的帮我们解决了这类问题。

// 宏实现加法函数
#define Add(x,y) ((x)+(y))
//inline内联
inline int Add(int x, int y)
{
    int ret = x + y;
    return ret;
}

        这时候,内联函数就可以类似宏函数来使用,并且也会减少宏函数出现的一系列优先级的问题。但在使用内联函数的时候需要注意,不建议将定义声明放在两个分离的文件当中,最好还是内联函数放在.h文件当中频繁调用的短小函数可以设计为内联函数

七,nullptr

        nullptrC++专用的空指针,是一个关键字nullptr可以通过类型强转转化为任意类型指针,但是不可以转化为整型0,从而避免了一些程序编写时的歧义问题。

八,结语

        这就是我们在刚刚进入C++学习时需要知道的知识了,之后我会更新C++类和对象的知识。希望这章节的知识点我讲的清楚明白,大家一起相互学习加油加油!!!

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

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

相关文章

RSRS研报复现——年化21.5%,含RSRS标准分,右偏标准分的Backtrader指标计算(代码+数据)

原创文章第583篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 继续Backtrader&#xff0c;今天讲讲指标扩展。 作为规则型的量化框架&#xff0c;指标是非常重要的元素&#xff0c;它是策略的基础。 我们来扩展一个经典的指标&#xff0c;RSR…

matlab数值溢出该怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

LabVIEW自动测控与故障识别系统

使用LabVIEW 2019在Win10 64位系统上开发自动测控软件&#xff0c;通过与基恩士NR-X100数据采集仪通讯&#xff0c;实时采集和分析数据&#xff0c;自动识别判断产品是否合格&#xff0c;并增加数据记录和仿真功能。 具体解决方案&#xff1a; 1. 系统架构设计 硬件接口&#…

前端面试题38(js原型与对象)

在JavaScript中&#xff0c;原型&#xff08;prototype&#xff09;是核心特性之一&#xff0c;它用于实现对象之间的继承和属性方法的共享。理解原型和对象的关系对于深入学习JavaScript至关重要。下面我会详细解释这两个概念以及它们是如何工作的&#xff0c;并给出一些示例代…

Java设计模式---(创建型模式)工厂、单例、建造者、原型

目录 前言一、工厂模式&#xff08;Factory&#xff09;1.1 工厂方法模式&#xff08;Factory Method&#xff09;1.1.1 普通工厂方法模式1.1.2 多个工厂方法模式1.1.3 静态工厂方法模式 1.2 抽象工厂模式&#xff08;Abstract Factory&#xff09; 二、单例模式&#xff08;Si…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥协商(ArkTS)】

密钥协商(ArkTS) 以协商密钥类型为X25519 256&#xff0c;并密钥仅在HUKS内使用为例&#xff0c;完成密钥协商。 开发步骤 生成密钥 设备A、设备B各自生成一个非对称密钥&#xff0c;具体请参考[密钥生成]或[密钥导入]。 密钥生成时&#xff0c;可指定参数HUKS_TAG_DERIVE…

LLM-文本分块(langchain)与向量化(阿里云DashVector)存储,嵌入LLM实践

文章目录 前言向量、令牌、嵌入分块按字符拆分按字符递归拆分按token拆分 向量化使用 TextEmbedding 实现语义搜索数据准备通过 DashScope 生成 Embedding 向量通过 DashVector 构建检索&#xff1a;向量入库语义检索&#xff1a;向量查询完整代码 总结 前言 Transformer 架构…

[C++][ProtoBuf][Proto3语法][三]详细讲解

目录 1.默认值2.更新消息1.更新规则2.保留字段reserved 3.未知字段1.是什么&#xff1f;2.未知字段从哪获取 4.前后兼容性5.选项option1.选项分类2.常用选项列举3.设置自定义选项 1.默认值 反序列化消息时&#xff0c;如果被反序列化的⼆进制序列中不包含某个字段&#xff0c;…

基于Spring Boot的旅游信息推荐信息系统设计与实现(源码+lw+部署+讲解)

技术指标 开发语言&#xff1a;Java 框架&#xff1a;Spring BootJSP JDK版本&#xff1a;JDK1.8 数据库&#xff1a;MySQL5.7 数据库工具&#xff1a;Navicat16 开发软件&#xff1a;IDEA Maven包&#xff1a;Maven3.6.3 浏览器&#xff1a;IE浏览器 功能描述 旅游信…

Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析

章节内容 上一节我们完成了内容&#xff1a; Flume 启动测试Flume Conf编写Flume 测试发送和接收数据 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但…

深入探索大语言模型

深入探索大语言模型 引言 大语言模型&#xff08;LLM&#xff09;是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理&#xff08;NLP&#xff09;任务中展示了惊人的能力&#xff0c;从文本生成到问答系统&#xff0c;无所不包。本文将从多个角度全面介绍大语…

AGE agtype 简介

AGE 使用一种名为 agtype 的自定义数据类型&#xff0c;这是 AGE 返回的唯一数据类型。agtype 是 Json 的超集&#xff0c;也是 JsonB 的自定义实现。 简单数据类型 Null 在Cypher中&#xff0c;null用于表示缺失或未定义的值。概念上&#xff0c;null表示“缺失的未知值”&…

路径规划 | 基于蚁群算法的三维无人机航迹规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 基于蚁群算法的三维无人机航迹规划&#xff08;Matlab&#xff09;。 蚁群算法&#xff08;Ant Colony Optimization&#xff0c;ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式算法。该算法通过模拟蚂蚁在寻找食物时…

【安全设备】Web应用防火墙

一、什么是Web应用防火墙 Web应用程序防火墙&#xff08;Web Application Firewall&#xff09;的缩写是WAF&#xff0c;用于保护Web应用程序免受各种恶意攻击和漏洞利用。WAF通过监控和过滤进出Web应用程序的HTTP/HTTPS流量来工作。它位于Web应用程序和用户之间&#xff0c;分…

【总线】AXI第九课时:介绍AXI响应信号 (Response Signaling):RRESP和 BRESP

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

STM32F103RB多通道ADC转换功能实现(DMA)

目录 概述 1 硬件 1.1 硬件实物介绍 1.2 nucleo-f103rb 1.3 软件版本 2 软件实现 2.1 STM32Cube配置参数 2.2 项目代码 3 功能代码实现 3.1 ADC功能函数 3.2 函数调用 4 测试 4.1 DMA配置data width&#xff1a;byte 4.2 DMA配置data width&#xff1a;Half wor…

java如何实现一个死锁 ?

死锁(Deadlock)是指在并发系统中,两个或多个线程(或进程)因争夺资源而互相等待,导致它们都无法继续执行的一种状态。 一、简易代码 public class DeadlockExample {private static final Object lock1 = new Object();private

如何在 ASP.NET MVC 项目中使用身份验证器应用程序实现多因素身份验证?

介绍 增强安全性对于任何应用程序都至关重要&#xff0c;而多因素身份验证 (MFA) 是实现此目标的有效方法。在本文中&#xff0c;我们将介绍在 ASP.NET MVC 项目中使用身份验证器应用程序集成 MFA 的过程。无论您是从头开始还是将 MFA 添加到现有项目&#xff0c;本指南都将提…

生物素标记降钙素Biotin-α-CGRP, rat 中间体

生物素标记降钙素Biotin-α-CGRP, rat 中间体是一种特定的生物化学试剂&#xff0c;主要用于科学研究领域。以下是对该产品的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;生物素标记降钙素Biotin-α-CGRP, rat 中间体 英文名称&#xff1a;Biotin-α-CGRP, rat 纯度…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…