【C++】c++语法基础

引入,第一个c++程序

这是用c++写的helloworld程序

#include<iostream>
using namespace std;
int main()
{cout << "hello,world\n" << endl;return 0;}

接下来我们将根据上述的代码来学习c++的基本语法。

命名空间(namespace)

在c语言中函数被包含在不同的头文件中,但是,这样会出现一个问题,当我们定义的变量与头文件中的变量重名时,在调用时就会出现问题。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{printf("%d\n", rand);return 0;
}

 此时编译器就不能区分rand究竟是什么了。

为了解决这一问题,c++引入了命名空间这一概念。c++中将函数,变量封装在命名空间中。

定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以不同的命名空间中同名的变量就不在冲突了。

#include <iostream>namespace A {int x = 5;void printX() {std::cout << "x in namespace A: " << x << std::endl;}
}namespace B {int x = 10;
}int main() {A::printX(); // 输出:x in namespace A: 5B::x = 15; // 修改命名空间B中的变量x的值A::printX(); // 输出:x in namespace A: 5,命名空间A中的x并未受到影响return 0;
}

A和B这两个命名空间中的X不会相互影响 。

C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

namespace只能定义在全局,当然它还可以嵌套定义。

#include <iostream>
using namespace std;
namespace YG 
{int x = 5;namespace XIN {int x = 2;}
}
int main()
{cout << YG::x << endl;cout << YG::XIN::x << endl;return 0;
}

项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。

C++标准库都放在⼀个叫std(standard)的命名空间中 。

命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以 下⾯程序会编译报错。所以我们要使用命名空间中定义的变量/函数,有三种方式

指定命名空间访问,项目中推荐这种方式。通过作用域解析运算符(::)来精确访问。

#include <iostream>
using namespace std;
namespace YG 
{int x = 5;namespace XIN {int x = 2;}
}
int main()
{cout << YG::x << endl;cout << YG::XIN::x << endl;return 0;
}

using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。

//展开命名空间的某个成员
#include <iostream>
using namespace std;
namespace YG
{int x = 5;namespace XIN{int y = 2;}
}
using YG::x;
int main()
{cout << x << endl;cout << YG::XIN::y  << endl;return 0;
}

展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。

//展开整个命名空间
#include <iostream>
using namespace std;
namespace YG
{int x = 5;namespace XIN{int y = 2;}
}
using namespace YG;
using namespace YG::XIN;
int main()
{cout << x << endl;cout << y << endl;return 0;
}

在这里我们可以发现嵌套定义的命名空间,只展开最高层的命名空间并不能直接访问其包含的其他命名空间中的变量。若要访问其下层的命名空间也需要单独展开。

C++输入&输出

在C++中,iostream 是一个标准库,用于处理输入(input)和输出(output)。它提供了一种方便的方式来进行控制台输入输出操作和文件操作。

具体来说iostream提供了以下主要的类和对象:

• std::cin 是istream类的对象,它主要面向窄字符(narrowcharacters(oftypechar))的标准输入流。

• std::cout 是ostream类的对象,它主要面向窄字符的标准输出流。

• std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。

• >>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)

• 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现),其实最重要的是 C++的流能更好的支持自定义类型对象的输入输出。


#include <iostream>
using namespace std;
int main()
{int a = 0;double b = 0.1;char c = 'x';cout << a << " " << b << "  " << c << endl;printf("%d %lf  %c\n", a, b,c);// 可以自动识别变量的类型cin >> a;cin >> b >> c;cout << a << endl;cout << b << "  " << c << endl;return 0;
}

缺省参数

在 C++ 中,缺省参数(默认参数)允许在函数声明中为一个或多个参数指定默认值。这意味着在调用函数时,如果没有显式提供该参数的值,编译器将使用预先定义的默认值。默认参数的声明使得函数调用更加灵活,并且可以简化函数重载的需求。缺省参数分为全缺省和半缺省参数。


#include <iostream>
#include <assert.h>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func();//没有传参时,使用参数的默认值Func(10);  // 传参时,使用指定的实参return 0;
}

全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。

带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

#include <iostream>
using namespace std;
//全缺省void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
//半缺省void Func2(int a, int b = 10, int c = 20)//半缺省必须从右往左缺省
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);//传参必须从左往右依次传。Func2(,200,300)这样是错误的Func2(100, 200, 300);return 0;
}

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。这样可能会出现歧义,如下:

// 声明和定义中分别提供默认参数的情况(非法)
void example(int a, int b = 10); // 声明void example(int a, int b = 20) { // 定义// 函数体
}

函数重载

在 C++ 中,函数重载(Function Overloading)是指允许在同一个作用域内定义多个具有相同函数名但参数列表不同的函数。具体来说,函数重载可以通过以下几种方式实现:

  1. 参数个数不同: 在同一个作用域内,可以定义参数个数不同的同名函数。例如:

    void print(int a);
    void print(int a, int b);

    这里的 print 函数根据参数个数的不同,可以调用不同的实现。

  2. 参数类型不同: C++ 允许定义参数类型不同的同名函数。例如:

    void display(int a);
    void display(double a);

    这里的 display 函数根据参数的类型(整数或浮点数)来决定调用哪一个版本。

  3. 参数顺序不同: 参数的类型和个数相同,但顺序不同的函数也可以重载。例如:

    void drawLine(int x1, int y1, int x2, int y2);
    void drawLine(int x1, int x2, int y1, int y2);

    这里的 drawLine 函数定义了两个版本,分别用于不同顺序的坐标参数。

  4. 常量性区别: 如果一个函数的参数是常量引用(const 引用),那么可以通过区分参数是否为常量来实现重载。例如:

    void process(const int& x);
    void process(int& x);

    这里的 process 函数区分了参数 x 是常量引用还是非常量引用。

  5. 函数重载与返回类型无关: C++ 中,函数的返回类型不能作为重载的标志。也就是说,不能仅仅依靠返回类型的不同来重载函数。

    int calculate(int a, int b) {return a + b;
    }float calculate(int a, int b) {return a * b; // 错误:与前一个函数的返回类型相同,不允许重载
    }

    这样的两个函数是非法的,不构成函数重载。

引用

在 C++ 中,引用(Reference)是一个允许程序员使用别名访问变量或对象的机制。引用提供了对变量或对象的另一种名称,通过这个名称可以直接访问到原始的变量或对象,而不是其副本。这样可以解决一些指针的问题但不能替代指针。与指针不同的时,指针不指代变量本身,不能直接修改变量。

#include<iostream>
using namespace std;
int main()
{int a = 0;// 引用:b和c是a的别名int& b = a;int& c = a;// 也可以给别名b取别名,d相当于还是a的别名int& d = b;++d;// 这里取地址我们看到是⼀样的cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

引用只是给变量起了一个别名,所有的别名都只指那一个变量。

引用的特性

引用在定义时必须初始化 

在c语言中,指针在定义时,初始化是非强制的,但在c++的引用中,初始化是一种强制的行为。

⼀个变量可以有多个引用

引用⼀旦引用⼀个实体,再不能引用其他实体

#include<iostream>
using namespace std;
int main()
{int a = 10;//int& ra;//编译会报错,引用必须初始化int& b = a;int c = 20;b = c;//这里并非让b引用c,因为C++引用不能改变指向,//这里是赋值,a,b的值都变为20cout << &a << endl;cout << &b << endl;cout << &c << endl;return 0;
}

引用的使用 

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

引用传参跟指针传参功能是类似的,引用传参相对更方便⼀些

void Swap(int& rx, int& ry){int tmp = rx;rx = ry;ry = tmp;}int main(){int x = 0, y = 1;cout << x <<" " << y << endl;Swap(x, y);cout << x << " " << y << endl;return 0;}

const引用

在 C++ 中,const引用是一种特殊类型的引用,其声明中包含了const关键字,const引用允许我们通过引用访问对象,同时确保在引用生命周期内不会修改所引用的对象(只读不写)。

int main()
{const int a = 10;// 编译报错:error C2440 : “初始化” :⽆法从“const int”转换为“int& ”//这里的引用是对a访问权限的放大//int& ra = a;//这样才可以const int& ra = a;// 编译报错:error C3892 : “ra”:不能给常量赋值//ra++;//这里的引用是对b访问权限的缩小//rb++;int b = 20;const int& rb = b;// 编译报错:error C3892 : “rb”:不能给常量赋值return 0;
}

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

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

相关文章

基于DoDAF的陆上智能突击系统作战概念系统开发

源自&#xff1a;系统仿真学报 作者&#xff1a;王灿 纪浩然 郭齐胜 董志明 谭亚新 穆歌 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强…

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…

基于STM32的逻辑分析仪

文章目录 一、逻辑分析仪体验1、使用示例1.1 逻辑分析仪1.2 开源软件PulseView 2、核心技术2.1 技术方案2.2 信号采集与存储2.3 数据上传 3、使用逻辑分析仪4、 SourceInsight 使用技巧4.1新建工程4.2 设置工程名及工程数据目录4.3 指定源码目录4.4 添加源码4.5 同步文件4.6 操…

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件&#xff0c;限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件&#xff0c;指定要访问的域名 [ro…

VulnHub:colddbox easy

靶机下载地址 信息收集 主机发现 攻击机网段192.168.31.0/24&#xff0c;扫描同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 发现靶机&#xff0c;IP为192.168.31.176。 端口扫描 扫描靶机开放端口。 nmap 192.168.31.176 -A -p- -T4 开放了80,4512端口&#xff0c;注…

无人机之安全防护篇

在当今社会&#xff0c;园区的安全防护至关重要。无人机以其独特的视角、高效的作业能力和灵活的部署方式&#xff0c;为园区安防工作带来了前所未有的好处&#xff0c;显著提升了安全防护水平和管理效率。 一、全方位无死角的监控 与传统的固定摄像头相比&#xff0c;它不受位…

【Python Web】Flask扩展开发指南

Flask是一个轻量级的Python Web框架&#xff0c;它提供了丰富的扩展库和工具&#xff0c;可以帮助开发者快速构建Web应用。本篇博客将介绍如何进行Flask扩展开发&#xff0c;包括扩展的创建、配置、使用等方面的内容。 目录 Flask扩展开发指南 一、Flask扩展简介 二、创建Fl…

苹果CMS:资源采集站如何设置定时采集详细教程讲解

我们搭建好站点之后&#xff0c;会自定义一些采集&#xff0c;但是需要每天去手动执行&#xff0c;有时候甚至会忘记&#xff0c;那我们如何处理呢&#xff1f;今天我们就来介绍一下如何设置定时器。 如果按照官方例子来设置定时器会遇到一个问题就是采集的资源未绑定类型&…

[240728] Wikidata 介绍 | 微软与 Lumen 合作提升人工智能算力

目录 Wikidata 介绍微软与 Lumen 合作提升人工智能算力 Wikidata 介绍 中文&#xff1a; 文言: 粤语&#xff1a; 来源&#xff1a; https://www.wikidata.org/wiki/Wikidata:Introduction/zh 微软与 Lumen 合作提升人工智能算力 为了满足人工智能工作负载不断增长的需求&am…

查看路由表 netstat -r

“Kernel IP routing table” 是Linux系统中用于展示和配置IP路由的表。它告诉操作系统如何将数据包从一个网络接口发送到另一个网络或主机。下面是对您给出的路由表条目的解释&#xff1a; Destination&#xff1a;目的地地址&#xff0c;可以是具体的IP地址&#xff0c;也可…

「12月·长沙」人工智能与网络安全国际学术会议(ISAICS 2024)

人工智能与网络安全国际学术会议(ISAICS 2024)将于2024年12月20日-2024年12月22日在湖南长沙召开。会议中发表的文章将会被收录,并于见刊后提交EI核心索引。会议旨在在为国内与国际学者搭建交流平台,推进不同学科领域的融合发展&#xff0c;就当今人工智能与网络安全范畴内各学…

视觉-语言大模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代&#xff0c;城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生&#xff0c;以其强大的功能和创新的理念&#xff0c;成为构建城市智能商业枢纽中心的关键力量&#xff0c;推动着平台互通、业务贯通、管理协同的全新发展格局。…

这代码,给我看破防了……

之前有读者问&#xff0c;自己一直不明白如何写出合理的代码注释。 这也是不少程序员一直头疼的问题&#xff0c;比如接手新代码时&#xff0c;没有注释&#xff0c;完全搞不清逻辑&#xff1b;自己写的注释&#xff0c;跟不上代码修改&#xff0c;成了误导&#xff1b;复杂逻…

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

Postman测试工具详细解读

目录 一、Postman的基本概念二、Postman的主要功能1. 请求构建2. 响应查看3. 断言与自动化测试4. 环境与变量5. 集合与文档化6. 与团队实时协作 三、Postman在API测试中的重要性1. 提高测试效率2. 保障API的稳定性3. 促进团队协作4. 生成文档与交流工具 四、Postman的使用技巧1…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…