欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于C++基础知识点(一)

程序员文章站 2022-06-17 19:18:47
...

本文主要记录C++学习初识阶段的基本知识点,其中包括:命名空间,C++的输入与输出,缺省参数,函数重载,指针与引用,内联函数,auto关键字,空指针nullptr;其中重点的的知识点为函数重载和引用。通过这些知识的学习主要为了后面C++的学习做铺垫。

一.命名空间:

1.什么是命名空间:在C/C++ 中,变量,函数以及类都是大量存在的,这些变量,函数,类的名称都存在于全局变量中,会造成命名冲突或污染;而使用命名空间的目的就在于防止命名冲突或污染,对函数,变量和类进行命名隔离的效果。
其本质就是在做名字隔离;

-------------什么叫做名字隔离?
我们知道在C语言中,对于变量的定义要求,同一作用域中不能定义同一变量,不同作用域中可以定义同一变量;
即全局变量和局部变量是可以防止冲突的;

一些情况下C的语法让人头疼;
举个栗子:
关于C++基础知识点(一)

执行结果为:
关于C++基础知识点(一)
------为什么该程序符合同一定义域定义不同变量还会出现报错?
因为在C程序中所定义的变量与库中的函数重定义,虽然符合C语言的定义规则,但和C库中的函数名称相冲突编译之后还是会有很大的问题;

因此在C++中可以用命名空间namespace关键字来进行名字隔离;如下程序所示:
关于C++基础知识点(一)
2.命名空间的定义:定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间;
(1)普通命名空间:

namespace  std {            //std为命名空间的名称;
//命名空间的内容既可以定义变量,又可以定义函数;
int a=10;
int Add(int left,int right){ 
   return left+right;
 }
 }

(2)命名空间的嵌套:

namespace N1{
int a=10;
int b=20;
int Add(int left,int right){
   return left+right;
 }*斜体样式*
namespace N2{
int c=10;
int d=20;
int Sum(int left,int right){
  return left+right;
 }
 }

(3)同一个工程中也可以存在多个相同的命名空间,编辑器最后会合成一个命名空间;

在C++中一个命名空间就是一个新的作用域,命名空间中的所有内容都仅限作用于命名空间中;

3.命名空间的使用方法:
(1)加命名空间名称及作用域限定符:

int main(){
  printf("%d\n",std::a);     //std为命名空间名称;
  return 0;
 }

(2)使用using将命名空间成员引入;

#include <iostream>
using std::cout;
using std::endl;
int main(){
   cout<<"hello world"<<endl;        
 
 //cout为标准输出控制台;cin为标准输入控制台;必须包含头文件#include <iostream>;使用输入输出控制台不需要数据格式控制;
   return 0;
}

(3)使用using namespace命名空间命名;

#include <iostream>
using namespace std;
int main(){
  std::cout<<"hello world"<<std::endl;
  return 0;
}

三种写法比较:最后一种写法相对来说比较麻烦,但在一些代码中使用可能更易懂;简便一些可以写成第二种,比较实用;

二.C++的输入与输出:

首先我们要知道,输入和输出并不是C++语言中的正式组成成分;C和C++本身都没有为输入和输出提供专门的语句结构。在C语言中,输入和输出的功能是通过调用scanf函数和printf函数来实现的,在C++中是通过调用输入输出流库中的流对象cin和cout实现的。也就是说输入输出不是由C++本身定义的,而是在编译系统提供的 I/O 库中定义的;

注意:使用cin和cout时必须包含头文件 #include 以及标准命名空间名称
现在阶段我们只需要直到如何去使用就行;
关于C++基础知识点(一)

三.缺省参数:

在C++的语法中缺省参数就是指一个函数的参数,其相当于一个备胎的存在;即在声明或定义函数时为函数的参数指定一个默认值,在调用函数的过程中当没有指定实参时,就调用函数参数,否则就调用实参;

缺省参数又有全缺省参数和半缺省参数之分;接下来我们通过代码来展示全缺省和半缺省的区别和定义;

全缺省参数:关于C++基础知识点(一)
程序执行结果:
关于C++基础知识点(一)
当在main函数进行调用TestFunc()函数时,在没有指定实参时就调用函数默认参数;当定义了实参时就调用实参中的变量;调用的参数不同则输出的结果也不同;全缺省参数在给值时可以间隔,可以进行任意给值和调用;

半缺省参数:
关于C++基础知识点(一)
程序执行结果:
关于C++基础知识点(一)半缺省参数即在函数参数定义时没有给具体默认值,所以必须要注意:
(1)半缺省值只能从左到右依次来给,不能间隔空间;
(2)半缺省参数不能在函数的声明和定义中同时存在;
此外需要注意:
(3)关于缺省值必须是常量或全局变量;
(4)缺省参数在C语言中不支持;

四.内联函数:

1.什么是内联函数???-----------------------------以inline修饰的函数是内联函数。
2.为什么在C++中有内联函数的概念??
首先我们应该知道在C语言中调用一个函数必须要压栈,这样开销就会很大,使程序的运行效率降低;因此C语言中一般会用宏来替换解决压栈开销;因此有人可能会想到为什么不能用宏来解决C++中的压栈开销问题,因为宏自身也有自己的优点和缺点;(宏的优点:增强代码的复用性;提高性能;宏的缺点:由于程序在预处理阶段进行宏的替换,因此不方便调试;代码可读性差,可维护性差,容易误用;没有安全类型的检查;)所以在C++中通过inline ,const ,枚举来替换宏;而inline所修饰的函数—内联函数解决了压栈的开销,提高了程序的运行效率;

内联函数代码示例:

#include <iostream>
using std::cout;
using std::endl;
inline int Add(int left,int right){
     int ret=left+right;
     return ret;
}
int main(){
int cur=Add(1,2);
cout<<cur<<endl;
return 0;
}

3.内联函数的特性:
(1) inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
(2) inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
(3) inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

五.auto关键字:

1.auto在C语言中也是一个关键字,但在C语言中编辑器在默认缺省的情况下所有变量都是auto,所以我们不在做过多解释;在C++语法中C++11标准给出auto不再是一个存储类型的指针,而是作为一个新的类型的指示符来指示编辑器;auto声明的变量必须由编译器在编译时期推导而得;它的由来最初是因为python,因为python也是一个弱类型的语言,而auto也作为一个新的指示符,在后期代码的编写过程中会更方便;

注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变 量实际的类型。

2.auto的使用方法:
(1)与指针和引用结合起来使用:

#include <iostream>
using std::cout;
using std::endl;
int main() {   
   int x = 10;    
   auto a = &x;    
   auto* b = &x;   
   auto& c = x;         //auto声明引用类型
 
   cout << typeid(a).name() << endl;   
   cout << typeid(b).name() << endl;    
   cout << typeid(c).name() << endl;
 
     *a = 20;   
     *b = 30;     
      c = 40;
      return 0; 
  }

(2)在同一行定义多个变量:当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void TestAuto() {   
    auto a = 1, b = 2;    
    auto c = 3, d = 4.0;    // 该行代码会编译失败,因为c和d的初始化表达式类型不同
     } 

3.auto不能应用的场景:
(1)auto不能做函数的参数,因为如果auto做函数的形参,编辑器无法对其实参进行推导;
(2)auto不能直接用来声明数组;该数组的类型无法判断;

总结:

本文共讲了五个基础知识点:命名空间,C++的输入与输出,缺省参数,内联函数inline和C++关键字auto的用法;需要注意的是:在内联函数中C语言通常用宏来替换,而C++语法中通过inline ,const , 枚举替代宏;auto关键字在C++语法中的应用注意事项以及命名空间的写法和注意事项;

关于函数重载,C++中指针与引用的介绍以及nullptr空指针将在《关于C++基础知识点(二)》中总结介绍;