ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++基础(一) 简单认识一下C++

C++基础(一) 简单认识一下C++ 前言创作该博客的初衷是为了巩固和督促自己在C的学习也希望我的博客可以对您有所帮助。目录一.C的第一个程序二.命名空间2.1 namespace的价值2.2 namespace的定义2.3命名空间的使用三.C输入输出四,缺省参数五.函数重载结束语一.C的第一个程序C兼容C语言的大多数语法C中需要把定义文件代码的后缀改为.cpp,以便编译器调用C编译如果是linux下要用g编译不再是gcc。//c语言实现hello world #includestdio.h int main() { printf(hell0 world\n); return 0; }C有自己一套的输入输出#includeiostream using namespace std; int main() { couthello worldendl; return 0; }二.命名空间2.1 namespace的价值使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这个问题的。#includestdio.h #includestdlib.h int rand 0; int main() { //会报错提示rand重定义以前定义是函数 printf(%d\n, rand); return 0; }2.2 namespace的定义定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出一个域这个域跟全局域各自独立不同的域可以定义同名变量所以下面的rand不在冲突了。C中域有函数局部域全局域命名空间域类域域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量生命周期。namespace只能定义在全局当然他还可以嵌套定义。项目工程中多文件中定义的同名namespace会认为是一个namespace不会冲突。C标准库都放在一个叫std(standard)的命名空间中。#includestdio.h #includestdlib.h namespace lzx { int rand 0; } int main() { //这样就不会报错了 printf(%d\n, lzx::rand); return 0; }在这我们还要介绍另外一个东西域访问限定符我们都知道当全局域和局部域都定义了一个变量a时编译器会优先访问局部域但是通过域访问限定符我们可以指定访问某域的某变量。#includestdio.h #includestdlib.h namespace lzx { int a 0; } int a 10; int main() { int a 20; printf(%d\n, lzx::a);//访问lzx域里的变量a printf(%d\n, ::a);//访问全局域里的变量a printf(%d\n, a);//访问局部域里的变量a return 0; }2.3命名空间的使用编译查找一个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间里面去查找。所以下面程序会编译报错。所以我们要使用命名空间中定义的变量/函数有三种方式指定命名空间访问项目中推荐这种方式。using将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐这种方式。展开命名空间中全部成员项目不推荐冲突风险很大日常小练习程序为了方便推荐使用。#includestdio.h namespace lzx { int a 0; int b 10; } using namespace lzx;//全部展开 using lzx::a;//将某个成员展开三.C输入输出iostream 是Input Output Stream的缩写是标准的输入、输出流库定义了标准的输入、输出对象。std::cin 是istream类的对象它主要面向窄字符narrow characters (of type char)的标准输入流。std::cout 是ostream类的对象它主要面向窄字符的标准输出流。std::endl 是一个函数流插入输出时相当于插入一个换行字符加刷新缓冲区。 是流插入运算符 是流提取运算符。C语言还用这两个运算符做位运算左移/右移使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动指定格式C的输入输出可以自动识别变量类型(本质是通过函数重载实现的这个以后会讲到)其实最重要的是C的流能更好的支持自定义类型对象的输入输出。IO流涉及类和对象运算符重载、继承等很多面向对象的知识这些知识我们还没有讲解所以这里我们只能简单认识一下C IO流的用法后面我们会有专门的一个章节来细节IO流库。cout/cin/endl等都属于C标准库C标准库都放在一个叫std(standard)的命名空间中所以要通过命名空间的使用方式去用他们。一般日常练习中我们可以using namespace std实际项目开发中不建议using namespace std。这里我们没有包含stdio.h也可以使用printf和scanf在包含iostream间接包含了。vs系列编译器是这样的其他编译器可能会报错。四,缺省参数缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参缺省参数分为全缺省和半缺省参数。有些地方把缺省参数也叫默认参数全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。带缺省参数的函数调用C规定必须从左到右依次给实参不能跳跃给实参。函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省值。#includeiostream using namespace std; void Func(int a) { cout a endl; } int main() { void Func(int a 20);//定义与声明分离时声明给缺省值 Func();//没有传参使用默认值 Func(10);//传参使用传参值 return 0; }#includeiostream using namespace std; //半缺省 void Func1(int a,int b10) { cout a b endl; } //全缺省 void Func1(int a20, int b 10) { cout a b endl; }五.函数重载C支持在同一作用域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为使用更灵活。C语言是不支持同一作用域中出现同名函数的。#includeiostream using namespace std; 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; } int main() { add(1, 2); add(1.1, 2.2); return 0; }但是注意add()与add(int a10)虽构成函数重载但是调用时有歧义编译器不知道调用谁。但是我们可以通过命名空间域来解决#includeiostream using namespace std; namespace lzx { void add() { cout int add() endl; } } int add(int left 20) { cout int add(int left 20) endl; return left; } int main() { int a add(); return 0; }结束语感谢您的浏览如若发现术语或者代码有问题欢迎在评论区指出。传送门string类(一)传送门string类(二)
返回列表