介绍:
本文开始从C到C++的过度,C++是C的进阶版,在C中,本身存在很多不足和不安全性,C++是进一步弥补了C的不足并提供了更高级的用法,不仅如此,大部分C++编译器还支持C语言的用法,但C语言不支持C++的用法,这样一来C++即包括了C语言的优点,还拥有了自己的独特优势,在后面的写入中笔者会将两者语言掺和起来,以方便学者们理解。在平常区分C语言和C++我们可直接根据两者的后缀名,C语言的基础文件都是以".c"为后缀,而C++的基础文件都以".cpp"为后缀。
一,命名空间
在C/C++中,变量、函数和以后我们要学习的类都是大量存在的,但如果变量或函数名重复了又当会如何?C语言本身是无法解决此问题,一旦重复系统将报错,而C++将会使用命名空间解决此问题。在C++中专门有命名空间关键字namespace
#include <stdio.h> int rand = 0; int main() { //系统将会报错,因为在C语言库文件中就已定义了rand函数,不可再次进行定义 fprintf(stdout, "rand: %d", rand); return 0; }
1-1,命名空间的定义
定义:namespace 命名空间的名字,然后下面接一堆{}即可,{}中即为空间中的成员。
解析:命名空间相当于定义了一个新的作用域,该空间中的所有内容都局限于该空间中,不被外面影响,因此,它完美的解决了名称相同的问题。当要使用此空间中的成员时,需要用到域的作用限定符,即"::"。使用方法:命名空间名字::成员。要注意的是,使用结构体成员时:struct 命名空间的名字::结构体名称,并且,命名空间还可以嵌套使用。
#include <stdio.h> //str是命名空间的名字 namespace str { //命名空间里可以是任意类型 int rand = 0; int Add(int a, int b) { return a + b; } struct student { int age; int height; }; //命名空间的嵌套使用 namespace bitee { int a = 6; } } int main() { //整型类型的运用,其它类型同理 fprintf(stdout, "rand = %d\n", str::rand); //结构体类型的运用 struct str::student a1; a1.age = 2; fprintf(stdout, "结构体的运用: %d\n", a1.age); //函数的运用 fprintf(stdout, "Add(1, 2) = %d\n", str::Add(1, 2)); //命名空间的嵌套使用 fprintf(stdout, "嵌套使用: %d\n", str::bitee::a); return 0; }
注意:在这里要说明的是C++允许同一个工程中存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,但同一个文件下不允许存在相同名称的命名空间,因为这样运用的话当两者同时定义相同的变量名时编译器将"不知所措"。例如:一个工程中的test.h和test.cpp文件中都有namespace std,运行时两个的std会被合成一个。
1-2,命名空间的使用
命名空间的使用有三种方法,其中,以上运用域的限定符"::"只是其中最普通的一种。接下来我们观察以下两种。
1,使用using将命名空间中某个成员引入
#include <stdio.h> //str是命名空间的名字 namespace str { //命名空间里可以是任意类型 int rand = 0; int Add(int a, int b) { return a + b; } struct student { int age; int height; }; namespace bitee { int a = 6; } } //使用using后系统直接默认使用,这时不用域的限定符即可表示使用里面的数据 using str::rand; using str::bitee::a; int main() { fprintf(stdout, "%d %d\n", rand, a); return 0; }
2,使用using namespace 命名空间名称 将其全部引入
//将命名空间全部导入系统,这时会默认使用str using namespace str; int main() { fprintf(stdout, "%d %d\n", rand, bitee::a); return 0; }
1-3,C++标准官方命名空间
之前就说过,C++是C的进阶,C++高级功能的其中之一就体现在C++有自己的官方命名空间std,C++将标准库的定义实现都放到这个命名空间中,而std的使用通常与C++的里标准库文件密不可分,两者一般是配合使用。
C++常用标准函数:
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像C中printf/scanf输入输出时那样,需要手动控制格式。 C++的标准输入输出可以自动识别变量类型。
注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,笔者会详细跟大家介绍。
//引用头文件 #include <iostream> //标准命名空间的定义 using namespace std; int main() { int a = 5; float b = 3.5; char str[] = "abcdf"; cout << "a = " << a << endl << "b = " << b << endl << "str = " << str << endl; return 0; }
二,缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
#include <iostream> using namespace std; void Fun(int a = 5) { cout << "a = " << a << endl; } int main() { Fun(); //a = 5,采用该函数的缺省值5 Fun(10);//a = 10,有了实参就用该实参的值10 return 0; }
2.1,缺省参数分类
1,全缺省参数
全缺省参数是函数参数中全部指定缺省值,如下:
void Func(int a = 10, int b = 20, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; }
2,半缺省参数
半缺省参数是函数参数中部分指定缺省值,但这里有两条注意事项:1,半缺省参数必须从右往左依次来给出,不能间隔着给。2. 缺省参数不能在函数声明和定义中同时出现如下:
//参数从右到左必须依次给出 void Func(int a, int b = 20, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; } //错误运用 void Func(int a = 10, int b, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; }
//缺省参数的使用注意 #include <iostream> using namespace std; //函数定义和声明中不能同时给缺省值,因为编译器无法确定用哪个缺省值 //缺省值最好在声明中指定,因为我们运用函数一般都是先声明完之后在定义,如果系统先查看声明,里面没有缺省参数而定义中存在缺省参数将会报错 void fund(int a = 5) { cout << a << endl; } int main() { void fund(int a); fund();//将会报错,因为运行到函数声明时里面没有缺省参数而定义中指定缺省参数 return 0; }
当出现缺省参数时,函数传参也必须要从右到左依次给出,如下:
#include <iostream> using namespace std; void Func(int a = 10, int b = 20, int c = 30) { cout << a << endl; cout << b << endl; cout << c << endl; } int main() { Func();//a = 10,b = 20,c = 30 Func(2);//a = 2,b = 20,c = 30 Func(1, 2);//a = 1,b = 2, c = 30 Func(1, 2, 3);//a = 1,b = 2, c = 3 Func(, 3, );//错误用法 return 0; }
C++初阶1--2https://developer.aliyun.com/article/1424505?spm=a2c6h.13148508.setting.24.214f4f0e2QJGOK