前言:

学完了C语言和数据结构,我们可以进一步的学习C++。C++是兼容C语言的,所以C语言中的实现的hello world 依旧可以运行,C++中需要将定义文件代码后缀改为.CPP。

这是C语言中的hello world:

#include<stdio.h>
int main()
{
   printf("hello world");
   return 0;
}

这是C++中的hello world:

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

看不懂没关系,下面进行讲解。

1. 命名空间 namespace

1.1 命名空间的价值

命名空间可以对标识符的名称进行本地化,避免冲突或者名字污染,namespace关键字的出现就是针对这种情况。

1.2 namespace的定义

命名空间的关键词是namespace,后面跟命名空间的名字,然后接一对{},{}中即为命名空间的成员,可以包含变量,函数等。

#include<iostream>
using namespace std;
namespace zzj
{
   int a= 0 ;
   int add(int left,int right)
  {
     return left+right;
  }
}
int a = 1;
int add(int left,int right)
  {
     return left+right;
  }
int main()
{
  int ret1 = add(1,2);
  int ret2 = zzj::add(1,2);
  cout<< a<<endl;
  cout<< zzj::a<<endl;
  return 0;
}

在调用的时候通过::实现调用。

namespace的本质是定义一个域,这个域独立于全局域,不同的域可以定义同名变量。

在全局域定义了一个a,然后在namespace里面定义了一个同名的a。

C++中的域有局部域,全局域,命名空间域和类域。局部域和全局域影响变量的周期,局部域的变量出了局部就销毁,全局域的周期很长。命名空间域和类域不影响变量生命周期。

namespace只能在全局进行定义,可以嵌套定义。

嵌套定义:

namespace work
{
namespace zzj
{
   int a= 0 ;
   int add(int left,int right)
  {
     return left+right;
  }
}
namespace cj
{
   int a= 0 ;
   int add(int left,int right)
  {
     return left+right;
  }
}
  
  

}

嵌套定义的使用:

#include<iostream>
int main()
{
  cout<<work::zzj::add(1,2)<<endl;
  return 0;
}

C++标准库都放到叫std的命名空间里面。

1.3 命名空间的使用

当编译查找声明或定义时,通常先在局部域里面查找,然后再到全局域里面查找,一般不到命名空间里面查找。所以如果命名空间不被展开,下面程序就会报错。

#include<iostream>
namespace zzj
{ 
  int a = 0;
  int j = 1;
}
int main()
{
  printf("%d",a);
  return 0;
}

那么如何展开呢?我们通过using将命名空间进行展开,展开可以展开全部命名空间或者部分命名空间。

展开部分命名空间成员:

#include<iostream>

namespace zzj
{ 
  int a = 0;
  int j = 1;
}
using zzj::a;
int main()
{
  printf("%d",a);
  return 0;
}

展开命名空间全部成员:

#include<iostream>

namespace zzj
{ 
  int a = 0;
  int j = 1;
}
using namespace zzj;
int main()
{
  printf("%d",a);
  return 0;
}

注意:展开命名空间全部成员的风险很大,在项目中一般是不推荐的,很容易造成冲突。在日常的练习中为了方便推荐使用。

2. C++输入和输出

<iostream> 是input output stream 的缩写,是标准的输入、输出流库,定义了标准的输入和输出对象。在vs中,该库间接包含了<stdio.h>。

cin,cout,endl都属于C++标准库。

std::cin 是istream类的对象,是面向窄字符的标准输入流。

std::cout是ostream类的对象,是面向窄字符的标准输出流。

std:: endl是一个函数,相当于插入一个换行符加上刷新缓冲区。

日常练习中可以使用 using namespace std,但项目开发中不建议。

<<是流插入运算符,>>是流提取运算符。

C++中的输入输出可以自动识别变量类型。

3. 缺省参数 

缺省参数是在声明或定义函数时为函数的参数指定一个缺省值,在调用该函数时,如果木有指定参数,就用缺省值,否则使用实参。缺省参数分为全缺省和半缺省参数。

当函数声明和定义分离时,缺省参数不能在定义和声明中同时出现,规定缺省值必须给到函数声明。

3.1 全缺省参数 

全缺省参数就是全部的形参都给了缺省值。如:

#include<iostream>
int add(int a = 0,int b = 0)
{
  return a + b;
}

3.2 半缺省参数 

半缺省参数指表示所有的形参都有缺省值。

注意:缺省参数不能跳跃给缺省值,半缺省参数必须从右往左依次连续缺省。

如:

#include<iostream>
int add(int a ,int b = 0)
{
  return a + b;
}

如果是下面的情况就会报错。

#include<iostream>
int add(int a = 0,int b)
{
  return a + b;
}

3.3 缺省函数的具体用处

在我们之前实现栈的时候,当一开始初始化栈的时候,是将栈的空间设置为0。这个时候我们其实可以用到缺省函数,如果我们知道需要空间的大小,就可以通过传参进行空间赋值。如果不知道,就可以指定一个大小,如4,对空间大小进行赋值。

4. 函数重载

C++支持在同一作用域中出现同名函数,但需要这些函数的形参不同,可以是类型不同,也可以是个数不同。

int add(int left,int right)
{ 
  cout<<"int add"<<endl;
}
double add(double left,double right)
{
  cout<<"double add"<<endl;
}

注意:但是返回值不同不能作为重载条件,因为调用时不能区分。

5. 引用  

引用是给已存在变量取一个别名,引用和变量通用一个内存空间。

格式:

类型& 别名 = 引用对象;

可以给变量取别名,也可以给别名取别名。

int a = 0;
int& b = a;
int& c = a;
int& d = b;

特点:

一个变量可以有多个别名。

一个别名只能有一个实体。

引用在定义时必须初始化。

5.1 引用的使用

引用传参跟指针传参的功能类似,而且引用传参更方便。

例如我们之前常使用的swap函数。

void swap(int * x,int * y)
{
 int  tmp = *x;
  *x = *y;
  *y = tmp;
}

我们可以通过引用完全替代这个指针传参:

void swap(int& x,int& y)
{
   int tmp = x;
   x = y;
   y  =tmp;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部