C++第一课:C++基础

张开发
2026/4/16 15:39:14 15 分钟阅读

分享文章

C++第一课:C++基础
C起源与简介C是一种广泛应用的高级编程语言其最早被开发出来的目的是能够充分利用C语言的优势同时克服C语言的一些限制。C在多个领域中都有着重要地位特别是在系统编程、游戏开发、嵌入式系统等领域。许多重要的项目如操作系统、数据库管理系统、图形处理软件等都是用C编写的。其高性能、灵活性和可移植性使得它成为众多开发者的首选语言之一。C基础内容iostreamiostream是C里标准输入输出流库的头文件用于实现程序与控制台、文件之间的数据读写与C语言不同的是C的输入和输出是依赖“流stream”来实现的。标准输出流是“cout”标准输入流是“cin”。具体用法是“std::cout 变量 std::endl”“std::cin 变量 std::endl”endl表示换行类似于C语言的转义字符“\n”。命名空间namespace命名空间namespace是C里的一个新概念用于防止命名冲突的问题。众所周知在C语言里面由程序员自己定义的变量名和函数名等都不能相同也不能与C语言内的关键字相同为了避免这一问题C内使用了命名空间。命名空间的关键字就是“namespace”用法就是在namespace后加上一个命名空间的名字再加上一个花括号“{}”如“namespace bit{}”就相当于开辟了一个名为bit的命名空间。命名空间是一个单独的域。在命名空间内程序员可以随意定义变量名或函数名当然前提是同一个命名空间内不能重复C标准库就放在一个叫stdstandard的命名空间中此外命名空间还有以下几个特点1.同名的命名空间编译器在编译时会将它们自动合并这意味着你可以在多个文件中使用同一个命名空间。2.命名空间可以嵌套在一个命名空间内还能再创建一个或多个命名空间。3.命名空间不影响变量的生命周期。现在我们已经了解了命名空间的概念那如果我想要在我的主函数内使用命名空间内的变量或函数怎么办呢在讲解这个问题之前我们先来了解一下编译器是如何寻找变量的编译器在寻找变量时先在函数局部域内寻找如果没找到就在全局域内寻找。如果想让编译器找到在命名空间内的变量就需要引入一个新的符号“::”“::”是域作用限定符它的责任是告诉编译器去哪个空间寻找要使用的变量就比如“bit::变量名”用标准库来举个例子就是“std::cout”表示使用标准库std中的cout函数。我们现在了解了如何使用命名空间内的变量但是还有一个问题如果一个变量需要大量的使用怎么办难道每次都要打双冒号吗这时候就可以使用一个新的关键字“using”这个关键字的作用是让编译器查找变量时可以直接去命名空间内查找而不用再使用域作用限定符了具体用法就是“using namespace std”。这样子我再想使用cout这个函数时就可以直接使用而不用再写成std::cout了。缺省参数在使用C语言编写代码时我们常常会遇到这样一个问题在给某一函数传参时必须传一个具体的值过去这样有时候会有点麻烦比如我可能多次调用都使用的同一参数我就必须在每次调用时都使用传递一个相同的值。而C中的缺省参数就解决了这个问题缺省参数就是给函数中的变量设定一个默认值在调用时如果有参数传过来则使用传过来的参数若没有则使用这个默认值这样在一定程度上方便了很多。缺省参数在使用和定义的时候有一些规定是必须记住的1.缺省参数在声明和定义时只能写一次默认值如果声明和定义都写了默认值编译器就会报错这样设计的目的是避免声明时是一个默认值定义时又是另一个默认值这种情况。2.缺省参数在定义时必须从又往左依次定义不能跳着定义比如int a int b 1 int c 2如果定义成int a 1int b int c 2编译器就会报错。函数重载函数重载的意思就是在C里面你是可以编写两个同名函数的。在C语言里如果我们想定义两个结构几乎一样只是参数类型不同的函数时大部分时候只能在后面暴力的加上1、2这样的数字来进行区分。但是在C里你可以编写两个同名的函数只要它们的参数类型不同比如一个简单的加法函数你可以写成Addint a,int b和Adddouble a, double b这样当你在传参时编译器就会自动识别你传的参数是什么类型的然后进入对应的函数这样一来就变得特别方便了。有一个值得注意的问题是如果只是返回值的类型不同是不构成函数重载的因为在这种情况下编译器 不知道你具体想调用哪个函数所以必须是明确意义上的参数类型不同。当然也会有一些特殊情况比如结合上面的缺省参数如果两个函数定义为func和funcint a 10在定义时很明显是行得通的但如果我们在调用是没有传参直接调用func时编译器就会报错因为它无法判断你想调用的到底是哪个函数所以遇到这种情况就需要进行特殊的区分。引用引用的定义是给一个变量起一个新的名字与C语言中的指针差不多区别在于引用相当于直接给原变量所在的空间起了一个新的名字就好比一个人可能同时有大名、小名以及一些外号不管是用原先的名字还是后来的名字指向的都是同一个东西。引用的具体用法是在类型的后面加上一个如int a 10int b ab就是对a的引用改变b就等于改变了a。同时我们也可以引用新的变量名如int c b这样写c最终的值也是a。有一个问题需要注意不能控引用就是引用时必须初始化也就是在最开始就必须指定一个对象如int b这种写法就是错误的那这时候有人就会有疑问了为什么平白无故的要给一个变量起一个新的名字呢接下来我就来讲解一下它具体的使用方法最常见的就是用来函数传参。众所周知在C语言里函数的形参只不过是对实参的一份临时拷贝形参的改变并不影响实参那这时我们就可以使用引用这样一来参数在函数内的改变就会直接影响到原本的参数因为本质上它们都是同一个参数使用同一个地址如下图所示那这时候又有了一个新的疑问那我为什么不直接用指针呢接下来我就来讲解一下它和指针之间的区别。首先指针我们都知道是开辟了一块新的空间来专门存放所指向的地址在使用时进行解引用读取该地址后进行修改。我们能很明显看出来指针与引用之间的差别引用不用开辟一块新的空间它直接代表原先的那一块空间并且在使用时也不用进行解引用直接对其进行修改即可。这一对比我们就可以看的出来引用相比指针还是有不少的优势的即节省了空间也提高了效率。但是在C中引用与指针的关系是相辅相成的关系它们俩就像一对兄弟一样引用并不能直接替代指针因为C中的引用有一个致命的问题它无法修改指向的位置也就是说它一旦指定了指向哪一空间就无法再进行修改了而这一点指针就可以做到所以说它们是相辅相成的关系并不是直接的取代。引用有着许多的注意事项1.不能返回局部变量的引用比如int func(){int x 0; ruturn x;}这种写法就是错误的因为x是一个局部变量函数调用结束时就会被销毁此时返回去的就会是一个空引用相当于野指针所以是不行的.2.引用只能缩小权限无法放大权限如果我想引用的变量被const所修饰在引用时前面也必须加上const因为使用了const说明该变量编译器只有读的权限没有写的权限这时如果引用没被const修饰的话就变成了即可读又可写权限就被放大了。权限可以被缩小是什么意思呢就是假如原本的变量是即可读又可写的变量引用可以被const修饰就变成只可读一般在进行函数调用的时候若不想变量被改变就可以使用const 引用类型这种写法防止变量被改变。3.不可以引用常数和临时变量因为常数和临时变量生命周期都很短他们都没有独立的地址很容易变成空引用。但如果我想引用a b的结果怎么办呢其实也是有办法的还是用const因为虽然a b属于一个临时变量但是const本身就限制了引用只可以读不可以写所以就不存在引用悬空的问题了const int a 30这种情况也是可以实现的。inline内联函数inline也是C里的一个新关键字一般将其写在函数类型的前面代表这个函数是个内联函数那么内联函数是什么意思呢内联函数类似于C语言内的宏或者说内联函数就是为了替代宏而存在的大家都知道宏就是在编译时直接进行纯文本替换且不进行检查所以宏用起来总是会出现一些问题写起来也不好写。但是内联函数不一样它是一个真正的函数有类型、有作用域它只是建议编译器进行展开而不是强制展开这就意味着如果某个内联函数内的表达式过多编译器就会不进行展开而是直接跳转到函数内。宏inline纯文本替换真正的函数无类型、语法、作用域检查有类型、语法、作用域检查容易出错更危险更安全简单粗暴效率高只是建议编译器展开而不是强制通过上面的对比可以看得出来宏的缺点很多且不安全写法也更复杂而内联函数就简单很多且不容易出错更安全。当然我们上面也说过因为内联函数只是建议编译器展开所以一旦内联函数过于复杂编译器往往不会选择展开所以内联函数一般只在函数内容很短并且会被频繁使用的情况下才会被使用。nullptrnullptr也是C中的新关键字它的作用就和NULL一样代表为一个空指针。那这时候就会引出一个疑问都已经有NULL了为什么还要设定一个新关键字nullptr呢因为NULL这个空指针在被编译的时候会被编译器自动替换为一个整形0在C语言内可能没什么问题但是由于C内有函数重载的概念就会导致问题假设现在我们有两个同名函数int func (int* p) 和 int func(int a)如果我们在传参时传的是一个NULLfunc(NULL)NULL就会被替换成整形0就会进入后一个函数而不是前一个函数就与我们本身的目的不符所以这时候就设计出了nullptr来替换NULL。nullptr的功能是它可以根据需要转化为任何类型的空指针除了不会转化为整形不会和重载混淆这就解决了我们上面所说的问题这时候我们再调用func(nullptr);就会进入前一个函数了。总结总的来说学完了C的第一部分基础内容我最大的感触就是C相比于C语言确实进步了很多解决了C语言内存在的很多问题使用起来也会比C语言更加方便我更加期待C后面学习的新内容了。

更多文章