C++入门知识

news/2024/5/30 1:28:54/文章来源:https://blog.csdn.net/m0_73281594/article/details/136723279

目录

C++命名空间

命名空间的介绍

域作用限定符

命名空间的使用

C++的输入以及输出

C++中的缺省参数

缺省参数的介绍

缺省参数的使用

缺省参数的分类

全缺省参数

半缺省参数


在C++中,有63个关键字,而C语言只有32个关键字

asm do if return try continue auto double inline short typedef for
bool dynamic_cast int signed typeid public break else long sizeof typename    
throw case enum mutable static union wchar_t catch explicit namespace         
static_cast unsigned default char export new struct using friend 
class extern operator switch virtual register const false private 
template void true const_cast float protected this volatile while delete goto reinterpret_cast

📌

这些关键字不需要死记硬背

C++命名空间

命名空间的介绍

在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。而使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,而定义一个命名空间就相当于定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

例如,在C语言中,对于下面的程序

#include <stdio.h>
#include <stdlib.h>int rand = 10;int main()
{printf("%d\n", rand);return 0;
}
报错内容:
“rand”: 重定义;以前的定义是“函数”

因为在C语言中,存在一个名为rand()的函数,此时若将变量名定义为rand会与标准库中rand()函数名产生冲突,而C语言能解决这个问题方法只有更改变量名,否则没有其他办法

但是在C++中,可以使用命名空间解决这个问题

所谓命名空间指当前命名的变量所处的空间,在命名空间中,可以声明变量/类型/函数,例如

//命名空间1
namespace test1
{//变量int i = 0;//类型struct Student{int age;char name[20];};//函数int add(int x, int y){return x + y;}
}

在C++中,使用namespace关键字创建命名空间,语法如下:

namespace 命名空间名
{//变量/函数/类型
}//注意最后一行不需要分号,不同于结构体

在C++中,命名空间可以嵌套定义,例如:

//命名空间2
namespace test2
{int num = 0;//命名空间3namespace test3{int num = 0;}
}

对于上面的代码,在命名空间test2中嵌套定义了一个命名空间test3

有了命名空间,就可以解决上面C语言出现的问题,解决方法如下:

//头文件NameSpace.h中的命名空间4
//将rand变量放入命名空间test4中
namespace test4
{int rand = 10;
}//测试文件
//C++主函数
#include <iostream>
#include <stdlib.h>
#include "NameSpace.h"int main()
{//调用命名空间4中的rand变量,而不是标准库中的rand()函数printf("%d\n", test4::rand);return 0;
}
输出结果:
10

域作用限定符

在C++中,::表示域作用限定符,使用方法如下:

空间 :: 变量/类型/对象名

::左侧空间为空时,默认在全局中寻找::右侧的内容,例如:

//NameSpace.h文件中的命名空间2与嵌套的命名空间3
//命名空间2
namespace test2
{int num = 20;//命名空间3namespace test3{int num = 30;}
}//C++主函数
#include <iostream>
#include <stdlib.h>
#include "NameSpace.h"//全局变量
int num = 10;int main()
{//域作用限定符//局部变量int num = 0;printf("%d\n", num);//全局变量printf("%d\n", ::num);//指定命名空间的变量printf("%d\n", test2::num);//嵌套的命名空间的变量printf("%d\n", test2::test3::num);return 0;
}
输出结果:
0
10
20
30

命名空间的使用

在C++中,有三种使用命名空间的方法:

  1. 加命名空间名称及作用域限定符,例如N::a
  2. 使用using将命名空间中某个成员引入,也称部分展开,例如using N::a
  3. 使用using将命名空间整体引入,也称全局展开,例如using namespace N

测试实例:

//NameSpace.h中的命名空间1
namespace test1
{//变量int i = 10;//类型struct Student{int age;char name[20];};//函数int add(int x, int y){return x + y;}
}//加命名空间名称及作用域限定符
#include <iostream>
#include "NameSpace.h"int main()
{printf("%d", test1::i);return 0;
}
输出结果:
10//部分展开
#include <iostream>
#include "NameSpace.h"
using test1::i;int main()
{printf("%d", i);return 0;
}
输出结果:
10//全局展开
#include <iostream>
#include "NameSpace.h"
using namespace test1;int main()
{printf("%d\n", i);return 0;
}
输出结果:
10

💡

在实际使用过程中,更推荐指定以及部分展开,如果只是自己练习时,更推荐使用全局展开

注意,使用 using namespace N并不代表在函数中不可以指定,部分展开和全局展开都只是改变寻找方式,并不是使用了其中一种方式其他方式不可以再使用,只是大范围会包括小范围,而如果已经全局展开,那么再指定将直接去指定的命名空间找,而不是在全局展开的命名空间中找

当存在两个相同的命名空间时,会被合并成一个命名空间,而不是直接覆盖,例如

//NameSpace.h中的两个重名的命名空间
//两个同名的命名空间
namespace test5
{int num1 = 10;
}namespace test5
{int num2 = 20;
}//测试文件
//同名命名空间合并
#include <iostream>
#include "NameSpace.h"
using namespace std;
using namespace test5;int main()
{cout << test5::num1 << endl;cout << test5::num2 << endl;return 0;
}
输出结果:
10
20

C++的输入以及输出

在C++中,可以使用coutcin配合流插入运算符<<和流提取运算符>>使用,例如:

💡

使用coutcin时需要包含头文件iostream,注意C++的标准库头文件不包含不带有.h,并且需要引入命名空间std(C++中的标准命名空间)或者直接指定。因此推荐使用<iostream>+std的方式

//C++的输入和输出
#include <iostream>
using namespace std;int main()
{int num = 0;cout << "请输入数值:";cin >> num;cout << num << endl;return 0;
}
输入:
10
输出结果:
请输入数值:10
10

在上面的代码中,定义了一个num变量,通过标准输入对象cin和流提取运算符>>控制变量num的输入,不同于C语言,此处输入可以不需要取地址运算符&,对变量内容的输出使用标准输出对象cout和流插入运算符<<控制内容的输出,而endl表示换行符,作用效果类似'\n'

在C++中,输入和输出可以自动识别变量类型,故输出和输入不需要占位符

#include <iostream>
using namespace std;int main()
{//int num = 0;//cout << "请输入数值:";//cin >> num;//cout << num << endl;int num = 0;double num1 = 0;char c = 0;cin >> num >> num1 >> c;//多组内容的输入,相当于scanf("%d%lf%c", &num, &num1, &c);cout << num << ' ' << num1 << ' ' << c;//多组内容输出,相当于printf("%d %f %c", num, num1, c);return 0;
}
输入:
1 2.5 c
输出结果:
1 2.5 c

📌

scanf一样,cin会自动忽略空白字符

  • 也可以使用指定的方式使用coutcin
//C++的输入和输出
#include <iostream>int main()
{int num = 0;std::cin >> num;std::cout << num << std::endl;return 0;
}
输入:
10
输出:
10

C++中的缺省参数

缺省参数的介绍

在C++中,缺省参数是指在函数的定义以及声明中可以为形式参数赋值,例如

int add(int x = 0, int y = 0)
{return (x + y);
}

在上面的代码中,变量x和变量y赋值为0,称xy为缺省参数,两个0为两个缺省参数的缺省值,缺省值必须是常量或者全局变量

如果调用add函数时不传入实际参数或者同类型数值时,则add函数直接使用缺省参数的数值进行计算,例如

#include <iostream>
using namespace std;int add(int x = 0, int y = 0)
{return (x + y);
}int main()
{//调用add函数不传参数cout << add() << endl;//调用add函数传一个参数cout << add(1) << endl;//调用addd函数传两个参数cout << add(1, 2) << endl;return 0;
}
输出结果:
0
1
3

缺省参数的使用

在C++中,缺省参数有两种,第一种是全缺省参数,第二种是半缺省参数

在使用缺省参数时,必须遵循从右往左连续使用,不可以跳跃式使用,例如对于下面的函数:

int add(int x = 0, int y = 0, int z = 0)
{return (x + y);
}

使用时满足从右往左使用

//缺省参数
#include <iostream>
using namespace std;int add1(int x = 0, int y = 0, int z = 0)
{return (x + y);
}int main()
{//使用缺省参数时必须从右往左连续使用//正确使用方法add1(1, 2);//使用第三个缺省参数add1(1);//使用第二个和第三个缺省参数add1();//使用全部缺省参数add1(1, 2, 3);//不使用缺省参数//错误使用方法add1(1, , 2);//不可以直接使用第二个缺省参数add1(, 1, 2);//不可以直接使用第一个缺省参数add1(, , 1);//不可以直接使用第一个和第二个缺省参数add1(, 1, );//不可以直接使用第一个和第三个缺省参数return 0;
}

📌

“从右往左使用”意思是,当调用函数给函数传递实际参数时,第一个实参对应着第一个第一个形参,第二个实参对应着第二个形参,第三个实参对应着第三个形参,使用缺省参数时,当只传递一个实际参数时,该实际参数对应着第一个形参,此时使用第二个和第三个缺省参数,同理,当传递两个实际参数时,两个实际参数对应的前两个形参,使用第三个缺省参数,即总是满足最右边的缺省参数是第一个使用的

“连续使用”意思是,给函数传递实际参数到形参时,不能出现类似于第一个实际参数传给第一个形参,第二个实际参数不传内容,第三个实际参数传递给形参等间隔性的传递

缺省参数的分类

在C++中,缺省参数分为

  1. 全缺省参数
  2. 半缺省参数

全缺省参数

全缺省参数是指在函数声明或定义时,所有变量都是缺省参数,例如

int add1(int x = 0, int y = 0, int z = 0)
{return (x + y);
}

半缺省参数

半缺省参数是指在函数声明或定义中,部分变量是缺省参数,例如

int add1(int x, int y = 0, int z = 0)//只有y和z是缺省变量
{return (x + y);
}

半缺省参数中,必须满足从右往左依次连续给出,不可以跳跃式给缺省参数(由于从右往左使用的原则),不是缺省变量的需要在调用时传递实际参数,例如

//半缺省参数
int add2(int x, int y = 0, int z = 0)
{return (x + y);
}int add3(int x, int y, int z = 0)
{return (x + y);
}//不可以跳跃式给缺省值
int add4(int x = 0, int y, int z)
{return (x + y);
}int add5(int x, int y = 0, int z)
{return (x + y);
}int main()
{add2(1);//只有一个不是缺省参数时,必须为该形参传递实参add3(1, 2);//有两个不是缺省参数时,必须为两个形参传递实参add4(, 2, 3);//不可以使用,需要满足从右往左使用缺省参数的原则add5(1, , 3);//不可以使用,需要满足从右往左使用缺省参数的原则return 0;
}

声明和定义函数缺省参数时一定要保证二者的缺省参数以及缺省值一致,否则编译器无法确定该使用哪个缺省值

//NameSpace.h中的函数声明
int add6(int a = 20);//测试文件
int add6(int a = 20)
{return a;
}#include <iostream>
using namespace std;int main()
{cout<<add6(2)<<' ';cout<<add6()<<'\n';return 0;
}
输出结果:
2 20

如果使用函数定义和声明不同的缺省参数,在VS中,若定义在使用之前,会默认使用函数定义(因为此时的定义也充当了声明)中的缺省值

//NameSpace.h中的函数声明
int add7(int a = 10, int b = 20);
//测试文件
//缺省参数a的缺省值,声明和定义不同
int add7(int a = 0, int b = 20)
{return a + b;
}#include <iostream>
#include "NameSpace.h"
using namespace std;int main()
{cout << add7() << endl;return 0;
}
输出结果:
20//但是下面的代码将会报错,因为编译器找不到函数定义
//NameSpace.h中的函数声明
int add7(int a = 10, int b = 20);
//测试文件#include <iostream>
#include "NameSpace.h"
using namespace std;int main()
{cout << add7() << endl;return 0;
}//缺省参数a的缺省值,声明和定义不同
int add7(int a = 0, int b = 20)
{return a + b;
}
//编译器找不到add7的定义

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

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

相关文章

Flink通讯模型—Akka与Actor模型

Carl Hewitt 在1973年对Actor模型进行了如下定义&#xff1a;"Actor模型是一个把Actor作为并发计算的通用原语". Actor是异步驱动&#xff0c;可以并行和分布式部署及运行的最小颗粒。也就是说&#xff0c;它可以被分配&#xff0c;分布&#xff0c;调度到不同的CPU&…

【CVPR】闻声识人FaceChain-ImagineID,从音频中想象出说话人脸,FaceChain团队出品

一、概览 论文&#xff1a;FaceChain-ImagineID: Freely Crafting High-Fidelity Diverse Talking Faces from Disentangled Audio&#xff0c;https://arxiv.org/abs/2403.01901 本文提出了一个新的说话人脸生成任务&#xff0c;即直接从音频中想象出符合音频特征的多样化动态…

郭炜老师mooc第十一章数据分析和展示(numpy,pandas, matplotlib)

多维数组库numpy numpy创建数组的常用函数 # numpy数组import numpy as np #以后numpy简写为np print(np.array([1,2,3])) #>>[1 2 3] print(np.arange(1,9,2)) #>>[1 3 5 7] 不包括9 print(np.linspace(1,10,4)) #>>[ 1. 4. 7. 10.] # linespace(x,y,n)&…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞(2024年3月发布)

漏洞简介 某赛通电子文档安全管理系统 DecryptApplication 接口处任意文件读取漏洞&#xff0c;未经身份验证的攻击者利用此漏洞获取系统内部敏感文件信息&#xff0c;导致系统处于极不安全的状态。 漏洞等级高危影响版本*漏洞类型任意文件读取影响范围>1W 产品简介 …

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分&#xff0c;帮助模型决定在处理信息时&#xff0c;所应该关注的部…

QT 如何防止 QTextEdit 自动滚动到最下方

在往QTextEdit里面append字符串时&#xff0c;如果超出其高度&#xff0c;默认会自动滚动到QTextEdit最下方。但是有些场景可能想从文本最开始的地方展示&#xff0c;那么就需要禁止自动滚动。 我们可以在append之后&#xff0c;添加如下代码&#xff1a; //设置编辑框的光标位…

锂矿开采污废水处理需要哪些工艺设备

锂矿开采是一项重要的工业活动&#xff0c;但同时也会产生大量污废水。为了保护环境&#xff0c;及时有效地处理这些污废水至关重要。下面将介绍一些常用的工艺设备&#xff0c;用于锂矿开采污废水处理。 首先&#xff0c;对于锂矿开采产生的废水中的悬浮物和颗粒物的去除&…

C# OpenCvSharp 图片批量改名

目录 效果 项目 代码 下载 C# OpenCvSharp 图片批量改名 效果 项目 代码 using NLog; using OpenCvSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_Demo { publi…

【蓝桥杯】map和vector的简单练习

一.题目描述 二.问题分析 使用嵌套的容器 时间复杂度为O(NlogN)&#xff0c;O(logN)是map查找的时间复杂度。 #include <iostream> #include <map> #include <vector> using namespace std;const int N1e510; int n,m; map <int,vector<int> >…

SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…

基于udp协议的网络通信(windows客户端版+简易聊天室版),重定向到终端

目录 和windows通信 引入 思路 WSADATA 代码 运行情况 简单的聊天室 思路 重定向 代码 terminal.hpp -- 重定向函数 服务端 客户端 运行情况 和windows通信 引入 linux和windows都需要联网,虽然他们系统设计不同,但网络部分一定是相同的,所以套接字也是一样的 这…

sqllab第二十二关通关笔记

知识点&#xff1a; cookie注入报错注入 直接抓取对应的数据包&#xff0c;发现还是一个cookie注入 参数值被base64加密了 测试这里使用什么手段读取输入 构造payload:uname1 base64加密&#xff1a;MSc 出现了hacker的页面&#xff0c;说明信息错误但是单引号没起作用 使…

01_04_JavaWEB03_XML、Tomcat、http

XML_Tomcat10_HTTP 参考尚硅谷再总结复习 一 XML XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展 三个字表面上的意思是XML允许自定义…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的种类&#xff1a; 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

python爬虫 Appium+mitmdump 京东商品

爬虫系列&#xff1a;http://t.csdnimg.cn/WfCSx 前言 我们知道通过Charles进行抓包可以发现其参数相当复杂&#xff0c;Form 表单有很多加密参数。如果我们只用 Charles 探测到这个接口链接和参数&#xff0c;还是无法直接构造请求的参数&#xff0c;构造的过程涉及一些加密…

Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程

Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器&#xff0c;MC开服教程&#xff0c;All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服&#xff0c;可以方便切换不同Java版本&#xff0c;方便安装多个mc服版本。 视频教程&#xff1a;https:…

Linux下的第一个C++小程序——进度条

一、进度条小程序 1.行缓存区 printf函数的输出&#xff0c;会先进入缓存区&#xff0c;而Linux下的缓存区刷新机制是按行刷新&#xff08;根据不同系统机制不同&#xff09;&#xff0c;例如用printf函数去调试时&#xff0c;可以看到如果printf语句中不带换行&#xff0c;则…

lspci详解

lspci的作用 lspci是一个Linux命令&#xff0c;用于列出系统中的PCI总线设备信息。PCI&#xff08;Peripheral Component Interconnect&#xff09;是一种常见的计算机总线标准&#xff0c;用于连接各种外部设备&#xff08;如网卡、显卡、声卡等&#xff09;到计算机主板上。…