C++基本语法:命名空间,输入,输出,缺省参数,重载

张开发
2026/4/12 3:44:07 15 分钟阅读

分享文章

C++基本语法:命名空间,输入,输出,缺省参数,重载
目录1.C第一个程序1.1创建空文件1.2代码实现2.命名空间2.1namespace的价值2.2namespace的定义2.2.1函数会优先查找局部域2.2.2可以定义相同变量2.2.3C中所有的域隔离2.2.4namespace可以嵌套使用2.3命名空间使用2.3.1指定命名空间访问项⽬中推荐这种⽅式2.3.2 using将命名空间中某个成员展开项⽬中经常访问的不存在冲突的成员推荐这种⽅式。2.3.3展开命名空间中全部成员项⽬不推荐冲突⻛险很⼤⽇常⼩练习程序为了⽅便推荐使⽤。3.C输入输出4.缺省参数5.函数重载1.C第一个程序1.1创建空文件1.2代码实现C兼容C语⾔绝⼤多数的语法所以C语⾔实现的helloworld依旧可以运⾏C中需要把定义⽂件 代码后缀改为.cppvs编译器看到是.cpp就会调⽤C编译器编译当然C有⼀套⾃⼰的输⼊输出严格说C版本的helloworld应该是这样写的。2.命名空间2.1namespace的价值在C语言中有些变量的名称与函数名冲突就无法运用该变量名了为了防止命名冲突C中引入namespace来解决该问题虽然这里稍微改一下变量名就可以正常输出了而在一个公司内部一个项目多达几百w行代码而这么多的代码量肯定是由很多人写的这样的情况下两个人起的名字冲突概率还是很大的于是就出现了命名空间来解决这个问题2.2namespace的定义定义命名空间需要使⽤到namespace关键字后⾯跟命名空间的名字然后接⼀对{}即可{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域这个域跟全局域各⾃独⽴不同的域可以定义同名变量所以下 ⾯的rand不在冲突了。C中域有函数局部域全局域命名空间域类域域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑还会影响变量的⽣命周期命名空间域和类域不影响变量⽣命周期。namespace只能定义在全局当然他还可以嵌套定义。项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace不会冲突。C标准库都放在⼀个叫std(standard)的命名空间中。我们来逐条讲解2.2.1函数会优先查找局部域2.2.2可以定义相同变量要想定义相同变量就必须要用到namespace来定义命名空间域这样才能确保去调用相同变量时不冲突。这里可以看出相同变量可以调用但是需要注意要加上定义namespace的命名和 ::才能访问否则就是局部域或全局所以总结下来就是编译器语法查找确认默认先局部查找再全局查找找不到就报错。如果制定了作用域就直接去这个域查找没有找到就报错2.2.3C中所有的域隔离这里可以看出命名域不能放在局部域中只能定义在全局域中否则会报错2.2.4namespace可以嵌套使用2.3命名空间使用编译查找⼀个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数有三种⽅式2.3.1指定命名空间访问项⽬中推荐这种⽅式2.3.2 using将命名空间中某个成员展开项⽬中经常访问的不存在冲突的成员推荐这种⽅式。2.3.3展开命名空间中全部成员项⽬不推荐冲突⻛险很⼤⽇常⼩练习程序为了⽅便推荐使⽤。3.C输入输出 iostream 是Input Output Stream 的缩写是标准的输入、输出流库定义了标准的输入、输出对象std::cin是iostream类的对象它主要面向窄字符串一个字节的字符的标准输入流黑框框输入的任何东西都可以认为是字符串cin就是从字符串转换为对应的类型但是匹配不上就会报错std::cout是iostream类的对象它主要面向窄字符串的标准输出流。补充一下输出就是把任何类型的对象都转换成窄字符的串输出本质上就是都转换成字符串输出到控制台黑框框去是流插入运算符是流提取运算符/在与整形接触的时候和C语言一样依旧左移和右移但是和coutcin配合的时候就变成了流插入流提取std::endl是一个函数流插入输出时相当于插入一个换行字符加刷新缓冲区\n与endl的区别是刷新缓冲区频繁的刷新缓冲区会影响一个效率问题但刷新缓冲区也可以把endl前面写的东西及时的输出出去而\n则是会累积把东西都放到一个缓存再刷到对应的地方。在算法竞赛中还是建议使用\n效率更高补充一下在用C打ACM/蓝桥杯一些竞赛的时候输入输出在前面的时候会加下面几行代码可以提效率#includeiostream using namespace std; int main() { //在IO需求比较高的地方如部分大量输入的竞赛中加上以下3行代码 //可以提高CIO效率 ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); return 0; }4.缺省参数• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时如果没有指定实参 则采⽤该形参的缺省值否则使⽤指定的实参缺省参数分为全缺省和半缺省参数。有些地⽅把 缺省参数也叫默认参数• 全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左 依次连续缺省不能间隔跳跃给缺省值。• 带缺省参数的函数调⽤C规定必须从左到右依次给实参不能跳跃给实参。 • 函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省 值。#includeiostream //在C中函数都储存在std库中这里表示全部展开 using namespace std; //缺省参数直接在函数形参中默认给初始值调用时不用赋值 void Func(int a 0) { cout a endl; } //全缺省参数 void Func1(int a 10, int b 20, int c 30) { cout a a endl; cout b b endl; cout c c endl endl; } //半缺省参数C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。 void Func2(int a, int b 20, int c 30) { cout a a endl; cout b b endl; cout c c endl endl; } int main() { //没有传参时使⽤参数的默认值 Func(); //传参时使⽤指定的实参 Func(10); printf(\n); //C规定必须从左到右依次给实参不能跳跃给实参。 Func1(); Func1(1); Func1(1, 2); Func1(1, 2, 3); Func2(100); Func2(100, 200); return 0; } //注在分文件中要用缺省参数在头文件中需要给形参赋值但在函数实现时不能出现形参赋值5.函数重载C⽀持在同⼀作⽤域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。#includeiostream //在C中函数都储存在std库中这里表示全部展开 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; } //返回值不同不能作为重载条件因为调⽤时也⽆法区分 //void fxx() //{} // //int fxx() //{ // return 0; //} //下⾯两个函数构成重载 //但是调⽤时会报错存在歧义编译器不知道调⽤谁 //因为时缺省参数不用传值就可以调用但是两个都不需要传所以不知道调用哪一个 void f1() { } void f1(int a 10) { } int main() { Add(10, 20); Add(10.1, 20.2); f(); f(10); f(10, a); f(a, 10); return 0; }接下来两种情况函数重载就有问题了返回值不同不能作为重载条件因为调用时也无法区分无参数和全缺省可以构成构成函数重载传参的话去调用第二个f1没有问题但是不传参的时候就无法确定调用谁了还是会报错喜欢博主的文章不要忘记一件三联支持一下哦~

更多文章