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

C++入门知识

1.命名空间

1.1命名空间的概念

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

例子:

可以打印出rand的值

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

这里加了一个头文件就出现了名字重复了,因为头文件在运行时会打开头文件,里面的函数或者其它的与rand的名字一样,就会报错。

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

1.2命名空间的定义

定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}就可以了,{}了面就是命名空间的成员。

定义一个命名空间zym,::是一个域作用符,zym::rand表示去zym这个命名空间找这个空间里面的rand去打印,若不加zym则就是到全局作用域去找,命名空间有自己单独的一个域

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

 1.3命名空间可以放多类型

namespace zym
{int rand = 10;int Add(int left, int right){return left + right;}struct Node{int val;struct Node* next;};
}int main()
{printf("%d ", zym::rand);return 0;
}

 1.4命名空间可以嵌套

在大的命名空间中有俩个小的命名空间,每个空间的rand的值都是不一样的,可以通过访问不同的命名空间得到不同的rand值。

#include<stdio.h>
#include<stdlib.h>namespace zym
{namespace zym1{int rand = 10;}namespace zym2{int rand = 1;}
}int main()
{printf("%d ", zym::zym1::rand);printf("%d ", zym::zym2::rand);return 0;
}

1.5如何使用命名空间

1.5.1加命名空间名称及作用限定符

namespace zym
{int rand = 10;
}int main()
{printf("%d ", zym::rand);return 0;
}

1.5.2使用using将命名空间某个成员引入

#include<stdio.h>
#include<stdlib.h>
namespace zym
{int a = 10;
}
using zym::a;int main()
{printf("%d ",a);return 0;
}

1.5.3使用using将命名空间名称引入

#include<stdio.h>
#include<stdlib.h>
namespace zym
{int a = 10;int b = 2;
}
//using zym::a;
using namespace zym;int main()
{printf("%d ",a);printf("%d ", b);return 0;
}

2.c++输入和输出

#include<iostream>
using namespace std;int main()
{cout << "Hello World" << endl;return 0;
}

1.使用cout标准输出对象(输出到控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及要打开std。

2.cout和cin是全局的流对象,endl是特殊的c++符号,表示换行输出,都包含在<iostream>头文件中。

3. <<是流插入运算符 ,    >>是流提取运算符

4.使用c++输入输出更方便,不需要像printf和scanf一样输入输出时要手动控制格式(int要%d)。

5.cout是ostream类的对象,cin是istream类型的对象。

定义三个变量,输入时不用格式,会自动识别变量的类型

#include<iostream>
using namespace std;int main()
{int a;double b;char c;cin >> a >> b >> c;cout << a <<" " << b <<" " << c << endl;return 0;
}

3.缺省参数

3.1缺省参数概念

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

#include<iostream>
using namespace std;void Fun(int a = 1)
{cout << a << endl;
}
int main()
{Fun();Fun(2);return 0;
}

若没有实参则就用参数的默认值,第一个函数没有传所以a=1,第二个有实参,所以a=2

3.2缺省参数的分类

1.全缺省参数

void Fun(int a = 1, int b = 2,int c=3)
{cout << a << b << c << endl;
}

2.半缺省参数

void Fun1(int a, int b = 1, int c = 2)
{cout << a << b << c << endl;
}

注意:

1.半缺省参数必须从右往左依次,不能间隔的设置

2.缺省参数不能在函数声明和定义中同时出现(就是头文件设置就行,函数实现处不用写)

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

4.函数重载

4.1函数重载的概念

函数重载:是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

1.参数类型不同

#include<iostream>
using namespace std;void Add(int a, int b)
{int c = a + b;cout << c << endl;
}
void Add(double a, double b)
{double c = a + b;cout << c << endl;
}
int main()
{Add(1, 2);Add(1.1, 2.2);return 0;
}

 2.参数个数不同

#include<iostream>
using namespace std;void Fun()
{cout << 1 << endl;
}
void Fun(int a = 1)
{cout << a << endl;
}
int main()
{Fun(11);return 0;
}

 需要注意的是若俩个函数名一样,一个无参数,一个是缺省参数,要是调用函数时没有参数,则会报错,因为不知道是哪一个函数。

3.参数类型顺序不同

#include<iostream>
using namespace std;void A(int a, char b)
{cout <<"int a char b" << endl;
}
void A(char a, int b)
{cout << "char a int b" << endl;
}
int main()
{A(1, 'b');A('a', 2);return 0;
}

 5.引用

5.1引用的概念

引用不是新定义一个变量,而是个已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间。

就像爷爷叫孙子和爸爸叫儿子,儿子和孙子都是一个人

类型 + & +变量名字 = 引用实体

#include<iostream>
using namespace std;int main()
{int a = 10;int& ra = a;cout << a << ra << endl;return 0;
}

注意:引用类型和引用实体是同种类型

5.2引用特性

1. 引用在定义时必须初始化

2.一个变量可以有多个引用

3.引用一旦引用一个实体,就不能引用其他实体

5.3常引用

a为常量

 

5.4 引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用一块空间。

但在底层实现上是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点:

1.引用概念上定义一个别名,指针存储一个变量地址。

2.引用在定义上必须初始化,指针没有要求

3.引用在初始化时引用一个实体后,就不能引用其它实体,而指针可以指向一个再换成另一个同类型的实体。

4.没有NULL引用,指针可以

5.在sizeof中含义不同,引用结果为引用类型的大小,当指针始终是地址空间所占字节个数(一般为4个字节)

6.引用自加就是引用实体加一(引用加1实体也会加一,一起改变),指针自加就是向后偏移一个类型的大小

7.有多级指针但是没有多级引用

8.引用比指针使用起来更安全

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 全球激光位移传感器市场规模逐渐扩大 企业数量不断增多
  • 守护舌尖安全,破解EHS管理难题,食品加工企业的可持续发展之路
  • Vatee万腾平台:创新科技,驱动未来
  • 关于 Node.js、Deno 和 Bun 的思考
  • 企业如何做好数据防泄密丨十个措施杜绝泄密事件
  • android13 固定U盘链接 SD卡链接 TF卡链接 硬盘链接
  • 为什么要参加学术会议?
  • 油烟监测仪:守护厨房,让蓝天白云成为常态
  • EasyOCR: 简单易用的多语言OCR工具
  • OS-HACKNOS-2.1
  • 快速上手LangChain:构建强大的语言模型应用
  • 量化交易常用名词介绍(七)——模块篇
  • 面向 Rust 新手的 Cargo 教程:轻松上手
  • Dockerfile 怎么在shell脚本中启动
  • springboot高校讲座预约管理系统-计算机毕业设计源码21634
  • JS 中的深拷贝与浅拷贝
  • SegmentFault for Android 3.0 发布
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • angular组件开发
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • es6--symbol
  • mysql外键的使用
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零搭建Koa2 Server
  • 基于web的全景—— Pannellum小试
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #define,static,const,三种常量的区别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)字符分类函数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (编译到47%失败)to be deleted
  • (学习日记)2024.01.19
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)mysql使用Navicat 导出和导入数据库
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET Core 2.1路线图
  • .Net FrameWork总结
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net8.0与halcon编程环境构建
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET实现之(自动更新)
  • ::什么意思
  • :class的用法及应用
  • @Autowired @Resource @Qualifier的区别
  • @Data注解的作用
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)