前言:
学完了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;
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » C++入门基础
发表评论 取消回复