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

C++入门基础(上)

目录

一、命名空间

1.命名空间的作用

 2.命名空间的定义

3.命名空间的使用

二、C++输入与输出

三、缺省参数 

四、函数重载 


一、命名空间

1.命名空间的作用

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

c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”printf("%d\n", rand);return 0;
}
//定义了一个全局变量rand,头文件<stdlib.h>中存在"rand"函数的定义,由此产生了冲突

 2.命名空间的定义

•定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中。
即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以在命名空间中定义rand就不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/
类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响
编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
• namespace只能定义在全局,还可以嵌套定义。
• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
• C++标准库都放在⼀个叫std(standard)的命名空间中。

3.命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
• 指定命名空间访问,项⽬中推荐这种⽅式。
• using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
• 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

#include<stdio.h>
namespace test
{int a = 0;int b = 1;
}
int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);return 0;
}// 1.指定命名空间访问
int main()
{printf("%d\n", test::a);return 0;
}
//2.using将命名空间中某个成员展开
using test::b;//::为域作用限定符
int main()
{printf("%d\n", test::a);printf("%d\n", b);return 0;
}
//3.展开命名空间中全部成员
using namespace test;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

二、C++输入与输出

 •<iostream>是Input Output Stream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象。
• std::cin是istream类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。
• std::cout是ostream类的对象,它主要⾯向窄字符的标准输出流。
• std::endl是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
• <<是流插⼊运算符,>>是流提取运算符。(C语⾔⽤这两个运算符做位运算左移/右移)
• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊。
•输出可以⾃动识别变量类型(本质是通过函数重载实现的),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。 

•cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要
通过命名空间的使⽤⽅式去⽤他们。

#include <iostream>
using namespace std;
int main()
{cout << "hello world" << endl;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(100, 200, 300);return 0;
}

四、函数重载 

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

以上为部分C++入门基础内容,更多内容请详见C++入门基础(下):C++入门基础(上)-CSDN博客。

感谢各位的支持,祝大家天天开心,学习进步。


http://www.mrgr.cn/news/29399.html

相关文章:

  • ??Ansible——ad-hoc
  • 活动系统开发之采用设计模式与非设计模式的区别-后台功能总结
  • 函数题 6-9 统计个位数字【PAT】
  • 建立这一新框架以应对人才紧缺时期的敏捷内容运营
  • 论文速递 | 基于MIC-ICEEMD-RIME-DHKELM的碳排放预测模型研究
  • 解决nginx代理SSE接口的响应没有流式返回
  • MUNIK谈ASPICE系列专题分享(一)什么是ASPICE?
  • 农产品交易平台的设计与实现
  • 该州允许AI帮助裁定失业申请
  • linux 内核代码学习(九)--Linux内核启动和文件系统
  • 【工具】Java Excel转图片
  • 基于SpringBoot的在线教育平台的设计与实现
  • 高密原型验证系统解决方案(上篇)
  • 【Elasticsearch系列十一】聚合 DSL API
  • html,css基础知识点笔记(二)
  • UE4_后期处理六—复古电视效果
  • RTX 4090 系列即将停产,RTX 5090 系列蓄势待发
  • uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等
  • 上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频
  • 项目实战 (13)--- 内部并发多线程一致性处理