C++ - 第一节

一.C++关键字(C++98)

C++总计63个关键字,C语言32个关键字  

asmdoifretuntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeid public
break elselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

二. 命名空间

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

#include <stdio.h>
#include <stdlib.h>

int rand = 10; //error:“rand”: 重定义;以前的定义是“函数”	
int main()
{
	printf("%d\n", rand);
	return 0;
}

 上述报错的原因,是因为在stdlib.h库里面中已经有rand定义了

要解决该问题,C++祖师爷定出来一个命名空间,是一个域

 2.1 命名空间定义

定义命名空间,需要使用到 namespace 关键字后面跟命名空间的名字然后接一对{}即可,{}中即为命名空间的成员。

1. 命名空间的普通定义 

namespace GalaxyPokemon //GalaxyPokemon是命名空间的名称
{
    // 命名空间中可以定义变量/函数/类型
    
    //定义变量
    int rand = 2024;    

    //定义函数
    int Add(int left,int right)
    {
        return left + right;
    }

    //定义类型
    struct Pokemon
    {
        struct Pokemon* pikaqiu;
        int val;
    };

}

 2. 命名空间的嵌套定义

namespace GalaxyPokemon1 //定义一个名叫GalaxyPokemon1的命名空间
{
    int a;
    int b;
    int Add(int left,int right)
    {
        return left + right;
    }

 namespace GalaxyPokemon2//嵌套一个名叫GalaxyPokemon2的命名空间
 {
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }

}

3.  同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。但是不允许同一个命名空间有相同名称的命名变量

 ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

// test.cpp
namespace N1
{
 int a;
 int b;
 int Add(int left, int right)
 {
     return left + right;
 }
 namespace N2
 {
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }
}
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
 int Mul(int left, int right)
 {
     return left * right;
 }
}

int main()
{
    printf("%d\n",N1::Add(1,2)); //打印结果:3
    printf("%d\n",N1::N2::Sub(1,2)); //打印结果:-1
    printf("%d\n",N1::Mul(1,2)); //打印结果:2
}

注意:一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。

 2.2 命名空间的使用

1. 域作用限定符

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

域作用限定符为两个冒号::其作用是:通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。

#include <stdio.h>
#include <stdlib.h>

int a = 0; //全局域 

namespace GalaxyPokemon
{
    int a = 1; //命名空间域
}

using namespace GalaxyPokemon; //展开了命名空间

int main()
{
    int a = 2; //局部域

    //默认局部搜索 -> 全局域 -> 展开了命名空间域(暴露到全局) or 指定访问命名空间域
    printf("%d\n", a);//打印结果: 2

    //指定访问命名空间域
    printf("%d\n", GalaxyPokemon::a);//打印结果: 1

    //加了::表示去左边的域里面搜索,::的左边是空白,空白就代表全局域
    printf("%d\n", ::a); //打印结果: 0

    return 0;
}

注意展开命名空间,就等于暴露到全局,如果此时全局中有与命名空间相同的定义,那么就会报错 

#include <stdio.h>
#include <stdlib.h>

int a = 0; //全局域 

namespace GalaxyPokemon
{
    int a = 1; //命名空间域
}

using namespace GalaxyPokemon; //展开了命名空间 = 暴露到全局

int main()
{
    printf("%d\n", a);//打印错误: a不明确

    return 0;
}

 2.加命名空间名称及作用域限定符

符号“::”在C++中叫做作用域限定符,我们通过“命名空间名称::命名空间成员”便可以访问到命名空间中相应的成员。

#include <stdio.h>
namespace GalaxyPokemon
{
    int a;
    double b;
}

int main()
{
    GalaxyPokemon::a = 10;//将命名空间中的成员a赋值为10

    //打印命名空间中的成员a
    printf("%d\n", GalaxyPokemon::a);//打印结果: 10
    return 0;
}

3. 使用using将命名空间中的成员引入 

 我们还可以通过“using 命名空间名称::命名空间成员”的方式将命名空间中指定的成员引入。这样一来,在该语句之后的代码中就可以直接使用引入的成员变量了。

#include <stdio.h>
namespace GalaxyPokemon
{
	int a;
}

using GalaxyPokemon::a; //将命名空间中的成员a引入

int main()
{
    int a = 10; //将命名空间中的成员a赋值为10
    printf("%d\n", a); //打印命名空间中的成员a

    return 0;    
}

4. 使用using namespace 命名空间名称引入

通过”using namespace 命名空间名称“将命名空间中的全部成员引入。这样一来,在该语句之后的代码中就可以直接使用该命名空间内的全部成员了。

#include <stdio.h>
namespace GalaxyPokemon
{
	int a;
}
using namespace GalaxyPokemon;//将命名空间GalaxyPokemon的所有成员引入
int main()
{
	a = 10;//将命名空间中的成员a赋值为10
	printf("%d\n", a);//打印命名空间中的成员a
	return 0;
}

5. 命名空间嵌套中的访问

有时候我们也需要进行嵌套定义多个相同的变量,可以使用“using 命名空间名称1::命名空间名称2::命名空间成员”进行访问

#include <stdio.h>
namespace GalaxyPokemon1 //定义一个名叫GalaxyPokemon1的命名空间
{
    int a = 0;
    int b;
    int Add(int left,int right)
    {
        return left + right;
    }

 namespace GalaxyPokemon2//嵌套一个名叫GalaxyPokemon2的命名空间
 {
     int a = 1;
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }

}

int main()
{
    printf("%d\n", GalaxyPokemon1::a); //打印结果:0
    printf("%d\n", GalaxyPokemon1::GalaxyPokemon2::a);  //打印结果:1
    printf("%d\n", GalaxyPokemon1::GalaxyPokemon2::Sub(5,3));//打印结果:2
    return 0;    
}

三. C++中的输入输出 

我们在C语言中经常使用到输入和输出,但是在C++中的输入和输出跟C语言的不太一样

C++的输入输出不需要增加数据格式控制,它能自动识别类型

3.1 输出

#include <iostream>

int main()
{
    // std是C++标准库的命名空间名,c++将标准库的定义实现都放到这个命名空间中
    using namespace std;
    //using std cout;//或者也可以这样
    int x = 10;
    double y = 11.1;
    // <<流插入运算符
    cout << "hello world!";//代表“hello world!”流向cout,cont可以理解成控制台
	cout << "hello world!" << endl;//end1代表换行的意思 
    cout << "hello world!" << x << '\n' << endl; //代表“hello world!” x \n都流向控制台
    cout << x << y << endl;//自动识别类型 打印结果 10 11.1
}

3.2 输入 

#include <iostream>

int main()
{
    // std是C++标准库的命名空间名,c++将标准库的定义实现都放到这个命名空间中
    using namespace std;
    //using std cin;
    int x = 10;
    double d = 11.11;

    // >>流提取运算符
    cin >> x >> d;//打印整型x 浮点数d
	return 0;
}

在C语言中有标准输入输出函数scanf和printf,而在C++中有cin标准输入cout标准输出。在C语言中使用scanf和printf函数,需要包含头文件stdio.h。在C++中使用cin和cout,需要包含头文件iostream以及std标准命名空间。 

四. 缺省参数 

缺省参数 概念

 在声明或定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果没有传参则采用该默认值,传参就使用指定的实参。

#include <iostream>
using namespace std;
void Print(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Print();//没有指定实参,使用参数的默认值(打印0)
	Print(10);//指定了实参,使用指定的实参(打印10)
	return 0;
}

缺省参数 分类

全缺省参数 - 即函数的全部形参都设置为缺省参数

void Print(int a = 10, int b = 20, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
    Print();
    Print(1);
    //Print(1,,3);这种方法是错误的。必须从左往右依次给出,不能间隔着给。
    Print(1,2);
    Print(1,2,3);
}

半缺省参数 - 即函数的参数不全为缺省参数

void Print(int a, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
    Print();
    Print(1);
    //Print(1,,3);这种方法是错误的。必须从左往右依次给出,不能间隔着给。
    Print(1,2);
    Print(1,2,3);
}

缺省参数 注意事项

1.半缺省参数必须从右往左依次给出,不能间隔着给。 

//错误示例
void Print(int a, int b = 20, int c)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

2.缺省参数不能在函数声明和定义中同时出现 

//错误示例
//test.h
void Print(int a, int b, int c = 30);
//test.c
void Print(int a, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

一般都是声明给,定义不给

3.缺省值必须是常量或者全局变量

//正确示例
int x = 30;//全局变量
void Print(int a, int b = 20, int c = x)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

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

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

相关文章

力扣1379---找出克隆二叉树的相同节点(Java、DFS、简单题)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; &#xff08;1&#xff09;&#xff1a; &#xff08;2&#xff09;&#xff1a; 题目描述&#xff1a; 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 ori…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

微信小程序使用自己的布局

我第一天学习微信小程序&#xff0c;照着黑马程序员老师的操作模仿编辑。因为视频是23年的&#xff0c;我24年4月份学习发现很多地方不一样了。 新版微信开发者工具中没有自带wxss文件。我自己建了一个list.wxss文件&#xff0c;发现用不了&#xff0c;在list.wxml文件中编写v…

【数据分享】1981-2023年全国各城市逐日、逐月、逐年最低气温(shp格式)

气象数据是我们在各种研究中都会使用到的基础数据&#xff0c;之前我们分享了Excel格式的1981-2023年全国各城市的逐日、逐月、逐年最低气温数据&#xff08;可查看之前的文章获悉详情&#xff09;。 好多小伙伴拿到数据后问我们有没有GIS矢量格式的该数据&#xff0c;我们专门…

Java-变量

变量是什么&#xff1a;就是可以变化的量&#xff01;Java是一种强类型语言&#xff0c;每个变量必须声明声明其类型Java变量是程序中最基础的存储单元&#xff0c;其要素包括变量名&#xff0c;变量类型和作用域 type varName [value][{,varName[value]}]; //数据类型 变量…

搜索二维矩阵2 合并两个有序链表

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int i matrix.size() - 1, j 0;while(i > 0 && j < matrix[0].size()){if(matrix[i][j…

软件设计师30--数据库系统章节回顾

软件设计师30--数据库系统章节回顾 章节重要内容考情分析 章节重要内容 考情分析

基于VUE的电影交流平台的设计与实现

摘 要 伴随着信息科技和互联网科技的迅猛发展&#xff0c;人们的消费重心随着生活水平的提高逐渐地转移到了精神层次&#xff0c;而电影则是其中之一。以前电影交流采用面对面交流的方法&#xff0c;局限了电影讨论交流的范围和方式。本系统是一个基于VUE框架&#xff0c;使用…

Java基础入门--Java API课后题

五、编程题 1.编写一个每次随机生成 10个 0&#xff08;包括&#xff09; 到 100 之间的随机正整数。 import java.util.Random;public class Example01{public static void main(String[] args) {for(int i0;i<10;i) {System.out.println(new Random().nextInt(0,100));}}…

ssm026校园美食交流系统+vue

校园美食交流系统 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

【C++ STL容器适配器】stack 栈

文章目录 【 1. 基本原理 】【 2. stack 的创建 】2.1 创建一个空的的 stack 适配器&#xff0c;并采用默认的 deque 基础容器2.2 指定其他序列式容器2.3 通过基础容器初始化 stack2.4 通过一个 stack 初始化另一个 stack 【 3. stack 支持的成员函数 】 【 1. 基本原理 】 st…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的&#xff1a; Redis 6.0 …

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套

华为海思校园招聘-芯片-数字 IC 方向 题目分享&#xff08;有参考答案&#xff09;——第九套 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei数字芯片题目&#xff0c;谢绝白嫖哈&#xff09; 单选 1&…

探索K-近邻算法(KNN):原理、实践应用与文本分类实战

第一部分&#xff1a;引言与背景 KNN算法在机器学习领域的重要性及其地位 KNN算法作为机器学习中的基石之一&#xff0c;由于其概念直观、易于理解并且不需要复杂的模型训练过程&#xff0c;被广泛应用于多种场景。它在监督学习中占据着特殊的位置&#xff0c;尤其适用于实时…

Tesseract 安装与配置及验证码识别

Tesseract 安装与配置 Tesseract 的使用&#xff0c;需要环境的支持&#xff0c;以实现简单的转换和训练。 1.环境 python版本&#xff1a;3.8.3 &#xff08;python2.7或3以上&#xff09; 操作系统&#xff1a;windows系统 2.Python安装 详见&#xff1a;Miniconda的…

吹爆!遥感高光谱分类(Python)

目录 一、数据集下载 二、安装包 三、数据处理 四、模型训练 五、模型推理 六、踩坑记录 一、数据集下载 Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC) (ehu.eus) Installing SPy — Spectral Python 0.21 documentation 二、安装…

Linux-exec函数族和system函数

参考资料&#xff1a;《Linux环境编程&#xff1a;从应用到内核》 execve函数 execve函数接口如下&#xff1a; #include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);参数&#xff1a; 第一个参数&#xff1a;filename是可执…

MATLAB技巧:从cell阵列里面提取部分cell的元素(使用大括号和小括号的情况)

在MATLAB中&#xff0c;元胞cell在定义的时候用的是小括号&#xff0c;如&#xff1a; 定义cell a cell(1,6);得到的cell如下&#xff1a; 对cell赋值 赋值的时候需要用大括号&#xff1a; a{1,3} 2&#xff1b;则可得到&#xff1a; 提取 如果要提取a的第3项的内容…

Unity Meta Quest MR 开发(五):空间锚点

文章目录 &#x1f4d5;教程说明 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 开发者社区&#xff0c;博主目前在内担任 XR 开发的讲师。该社区提供专人答疑、完整进阶教程、从零到一项目孵化保姆服务&…

11.内建函数对象_算数、关系、逻辑仿函数

文章目录 算数仿函数代码工程运行结果 关系仿函数代码工程运行结果 逻辑仿函数代码工程运行结果 算数仿函数 需要添加#include<functional>头文件使用 代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<functional>using namespace…